我有一个Arduino乌诺R3。 我为每个使用C ++我的传感器使逻辑对象。 Arduino的非常有限的板载内存32KB *,且平均,我的编译对象现身6KB左右*。
我已经使用所需的最小可能的数据类型,以试图尽量减少我的内存占用。 是否有一个编译器标志,以尽量减少二进制文件的大小,或者我需要用更短的变量和函数名,少功能等,以尽量减少我的代码库?
此外,为最大限度地减少二进制大小其它任何提示或建议的话,将不胜感激。
*它可能无法在KB来衡量(因为我没有它坐在我面前做),但1个对象大约是我的内存总容量,这是促使我关注的1/5。
有很多的技术来减少除了什么二进制大小us2012
,并在评论中提到别人,总结起来有我自己的一些要点:
- 使用
-Os
使GCC / G ++优化的大小。 - 使用
-ffunction-sections -fdata-sections
到翻译单元内的每个功能或数据分离成不同的部分。 与链接器选项结合起来-Wl,--gc-sections
摆脱任何未引用部分。 - 运行
strip
与至少以下选项: -s -R .comment -R .gnu.version
。 它可以结合--strip-unneeded
以除去不需要的重定位处理的所有符号。
如果你的代码不包含C ++ - 异常处理可以节省大量的空间(高达30K毕竟优化由Tuxdude提到的步骤)。 因此,你必须提供以下标志: -fno-exceptions
但是, 即使你不使用异常,异常处理可包括! 检查步骤如下:
no usage of new, delete
。 如果你真的需要它通过的malloc /免费包装更换。 举一个例子搜索“tinynew.cpp”
为纯虚拟呼叫提供的功能,例如extern "C" void __cxa_pure_virtual() { while(1); }
extern "C" void __cxa_pure_virtual() { while(1); }
- 覆盖__gnu_cxx :: __ verbose_terminate_handler()。 它处理未处理的异常和不名demangling,这是相当大的! (例如d_print_comp.part.10与9.5K或1.8K d_type)
干杯弗洛