【问题标题】:g++ compiler flag to minimize binary sizeg ++编译器标志以最小化二进制大小
【发布时间】:2013-02-25 05:06:11
【问题描述】:

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

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

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

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

【问题讨论】:

  • gcc -o3 , -o2 O 优化
  • @Grijesh No... -O3 通常会使二进制文件变大。
  • @Zak 优化大小的 gcc 选项是 -Os。您还可以在链接后strip 二进制文件的符号。
  • @us2012 真的!我想3 是为了更好的水平它的用途是什么?
  • @Grijesh 执行速度和二进制大小不一定相关。循环展开和频繁内联之类的事情可能会使程序更快,但会增加二进制文件的大小......

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您的代码不包含 c++ 异常处理,您可以节省大量空间(在 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)

    干杯 弗洛尔

    【讨论】:

    • 第 3 点帮助很大!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多