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

时间:2016-08-13 19:15:27

标签: c++ microcontroller iostream cortex-m

我使用GCC 5.2.0编译EFM32 MCU的代码(基于Cortex-M内核)。当我想要#include <iostream>时,我注意到代码大小的大幅增加。

例如,让我们为EFM32WG&#34; Wonder Gecko&#34;编译以下代码。芯片:

#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也无法帮助解决代码问题。

1 个答案:

答案 0 :(得分:0)

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

<iostream>是一个示例,它声明了一些全局对象,这些对象的 构造函数在调用main之前运行。它的包含将大致 将STM32的二进制文件大小增加140kB。

您可以在github上检查gcc开发人员的这种行为和推理。

解决方案是避免在微控制器上使用C语言提供的打印功能,例如printf()