17

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

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

此外,将不胜感激任何其他用于最小化二进制大小的提示或建议。

*它可能不是以 KB 为单位来衡量的(因为我面前没有它),但是 1 个对象大约是我总内存大小的 1/5,这引起了我的关注。

4

2 回答 2

43

除了评论中提到的内容和其他内容之外,还有很多减少二进制大小的技术,us2012用我自己的几点总结:

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

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

但是即使不使用异常,可以包含异常处理!检查以下步骤:

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

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

  3. 覆盖 __gnu_cxx::__verbose_terminate_handler()。它处理未处理的异常并进行名称拆解,这非常大!(例如 d_print_comp.part.10 与 9.5k 或 d_type 与 1.8k)

干杯弗洛

于 2014-12-27T14:47:30.680 回答