Почему iostream занимает так много места на флэш-памяти на MCU?

Я использую 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 тоже не поможет с размером кода.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …