为什么iostream在MCU上占用这么多闪存空间?

问题描述 投票:1回答:1

我使用GCC 5.2.0编译EFM32 MCU(基于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用于调试输出(通过为newlib实现_write功能并将输出路由到SWO引脚),但是考虑到MCU仅具有256k闪存,这种方法看起来非常浪费。 ,仅包含此标头将使代码用尽大部分。

所以,我的问题是:为什么是否包含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

我尝试了优化和不优化,但是最终的代码大小保持不变(优化后的大小可能小了1k)。

编辑2

[-fno-rtti-fno-exceptions也不帮助使用代码大小。

c++ microcontroller iostream cortex-m
1个回答
0
投票

尽管编译器确实尝试消除了未使用的完整包含或部分包含,但这有时会失败。仅包含一些标头导致代码运行-这意味着即使您未引用标头中包含的任何内容,编译器也无法从其中删除代码。

© www.soinside.com 2019 - 2024. All rights reserved.