我有一个Arduino Uno R3。我正在使用C ++为每个传感器制作逻辑对象。 Arduino的板载内存非常有限,只有32KB *,而且平均而言,我的编译对象大约是6KB *。
我已经在使用所需的最小数据类型,以尽量减少内存占用。是否有编译器标志来最小化二进制文件的大小,或者我是否需要使用更短的变量和函数名称,更少的函数等来最小化我的代码库?
此外,任何其他有关最小化二进制大小的建议或建议都将不胜感激。
*它可能无法用KB测量(因为我没有它坐在我面前),但是1个对象大约是我总内存大小的1/5,这引起了我的关注。
答案 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
但甚至如果您不使用例外,则可以包含异常处理! 请检查以下步骤:
no usage of new, delete
。如果你真的需要它,请用malloc / free包装器替换它们。有关“tinynew.cpp”
为纯虚拟呼叫提供功能,例如extern "C" void __cxa_pure_virtual() { while(1); }
干杯 FLO