克++编译器标志,以尽量减少二进制大小(g++ compiler flag to minimize

2019-07-21 06:10发布

我有一个Arduino乌诺R3。 我为每个使用C ++我的传感器使逻辑对象。 Arduino的非常有限的板载内存32KB *,且平均,我的编译对象现身6KB左右*。

我已经使用所需的最小可能的数据类型,以试图尽量减少我的内存占用。 是否有一个编译器标志,以尽量减少二进制文件的大小,或者我需要用更短的变量和函数名,少功能等,以尽量减少我的代码库?

此外,为最大限度地减少二进制大小其它任何提示或建议的话,将不胜感激。

*它可能无法在KB来衡量(因为我没有它坐在我面前做),但1个对象大约是我的内存总容量,这是促使我关注的1/5。

Answer 1:

有很多的技术来减少除了什么二进制大小us2012 ,并在评论中提到别人,总结起来有我自己的一些要点:

  • 使用-Os使GCC / G ++优化的大小。
  • 使用-ffunction-sections -fdata-sections到翻译单元内的每个功能或数据分离成不同的部分。 与链接器选项结合起来-Wl,--gc-sections摆脱任何未引用部分。
  • 运行strip与至少以下选项: -s -R .comment -R .gnu.version 。 它可以结合--strip-unneeded以除去不需要的重定位处理的所有符号。


Answer 2:

如果你的代码不包含C ++ - 异常处理可以节省大量的空间(高达30K毕竟优化由Tuxdude提到的步骤)。 因此,你必须提供以下标志: -fno-exceptions

但是, 即使使用异常,异常处理可包括! 检查步骤如下:

  1. no usage of new, delete 。 如果你真的需要它通过的malloc /免费包装更换。 举一个例子搜索“tinynew.cpp”

  2. 为纯虚拟呼叫提供的功能,例如extern "C" void __cxa_pure_virtual() { while(1); } extern "C" void __cxa_pure_virtual() { while(1); }

  3. 覆盖__gnu_cxx :: __ verbose_terminate_handler()。 它处理未处理的异常和不名demangling,这是相当大的! (例如d_print_comp.part.10与9.5K或1.8K d_type)

干杯弗洛



文章来源: g++ compiler flag to minimize binary size