g ++编译器标志,以最小化二进制大小

时间:2013-03-09 18:53:19

标签: c++ arduino g++ compiler-optimization

我有一个Arduino Uno R3。我正在使用C ++为每个传感器制作逻辑对象。 Arduino的板载内存非常有限,只有32KB *,而且平均而言,我的编译对象大约是6KB *。

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

此外,任何其他有关最小化二进制大小的建议或建议都将不胜感激。

*它可能无法用KB测量(因为我没有它坐在我面前),但是1个对象大约是我总内存大小的1/5,这引起了我的关注。

2 个答案:

答案 0 :(得分:27)

除了us2012和评论中提到的其他内容之外,还有很多技术可以减少二进制文件的大小,并将它们与我自己的一些点相加:

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

答案 1 :(得分:9)

如果您的代码不包含c ++ - 异常处理,您可以节省大量空间(在Tuxdude提到的所有优化步骤之后最多可以节省30k)。 因此,您必须提供以下标志: -fno-exceptions

甚至如果您使用例外,则可以包含异常处理! 请检查以下步骤:

  1. no usage of new, delete。如果你真的需要它,请用malloc / free包装器替换它们。有关“tinynew.cpp”

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

  4. 覆盖__gnu_cxx :: __ verbose_terminate_handler()。它处理未处理的异常并命名demangling,这是非常大的! (例如,带有9.5k的d_print_comp.part.10或带有1.8k的d_type)
  5. 干杯 FLO