Я использую GCC 5.2.0 для компиляции кода для MCU EFM32 (на основе ядра Cortex-M). Я замечаю ужасное увеличение размера кода, когда хочу #include <iostream>
,
Например, давайте скомпилируем следующий код для EFM32WG «Wonder Gecko»:
#include "em_device.h"#include "em_chip.h"#include <iostream>
int main(void)
{
CHIP_Init();
while (1) {
}
}
Этот код приведет к 172048 байтам кода, тогда как без #include <iostream>
это всего 1440 байт.
Я обычно просто использую cout
для отладочного вывода (путем реализации _write
функция для newlib и маршрутизации вывода на вывод SWO), но похоже, что этот подход очень расточительный, учитывая, что MCU имеет только 256 Кбайт флэш-памяти, и только включение этого заголовка заставит код использовать большую часть.
Итак, мой вопрос: Зачем Включает ли заголовок iostream скомпилированный код, занимающий такое безумное количество флэш-памяти? И еще, есть ли способ это исправить?
РЕДАКТИРОВАТЬ:
И компилятор и компоновщик arm-none-eabi-g++
(версия 5.2.0), библиотека C — это библиотека nano C (я думаю).
Вот мои флаги компилятора C ++ (исключая пути включения):
-g -gdwarf-2 -mcpu=cortex-m4 -mthumb '-DEFM32WG940F256=1' -O0 -Wall -c -fmessage-length=0 -mno-sched-prolog -fno-builtin -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
Вот мои флаги компоновщика:
-g -gdwarf-2 -mcpu=cortex-m4 -mthumb -T "${BuildArtifactFileBaseName}.ld" --specs=nosys.specs -Xlinker --gc-sections -Xlinker -Map="${BuildArtifactFileBaseName}.map" -mfpu=fpv4-sp-d16 -mfloat-abi=softfp --specs=nano.specs
Я пробовал как с оптимизацией, так и без нее, но размер результирующего кода остается примерно одинаковым (оптимизированный размер может быть на 1 КБ меньше).
РЕДАКТИРОВАТЬ 2
-fno-rtti
а также -fno-exceptions
тоже не поможет с размером кода.
Задача ещё не решена.
Других решений пока нет …