【问题标题】:Reducing C++ code size减少 C++ 代码大小
【发布时间】:2011-06-01 16:00:18
【问题描述】:

我正在为微控制器开发一种动态语言(编译成 C++),作为一名 CS 人,我决定先正确地完成它,然后再担心优化。下面是我的对象系统的结构,

Base (Interface) | |---- Number (Interface) | | | |-- Int | |-- Float | |---- Char | |---- Sequence (Interface) | | | |-- LinkedList | |---- Function (Interface) | |-- Built-in Functions (Functors)

现在一切正常,生成的代码大小开始成为问题,每个操作都必须由函子表示,(+,- while,for 等..) 所以我猜这是导致代码大小增加的原因或者我将所有内容作为基类传递,然后根据需要进行转换,因此我有很多转换,目前一个简单的 LED 开/关循环花费 15 KB,即使它不使用所有对象类型(6 个函子 + 4 个整数)。

我尝试了各种 avr-gcc 选项,但没有减少代码大小。所以我想知道我怎样才能弄清楚代码的哪一部分占用了这么多空间?

【问题讨论】:

  • 当您不显示实际生成的代码时,很难回答。您能否在 LED 开/关循环中发布 C++ 代码?
  • 您没有向我们提供足够的信息来告诉您问题所在(我不确定向我们提供信息是否可行)。我们或许可以提出如何找到问题的建议。 (另外,如果你有两个开/关循环,代码大小是 15.1kB 还是 30kB?)
  • @David 如果我使用两个相同的循环对应于 while(1){ turnOf; turnOff;} 相差 3 kbytes。
  • 确保使用优化运算符 '//' ;-)
  • 效果如何?

标签: c++ optimization


【解决方案1】:

在链接步骤中,您应该让 avr-gcc 生成一个地图文件,这样您就可以查看它,看看是什么占用了这么多空间。

请务必使用-ffunction-sections 编译选项和-Wl,-gc-sections 链接器选项从二进制文件中删除未使用的函数。

您正在使用 C++ 的哪些功能?其中一些(如类和命名空间)很便宜,而另一些则非常昂贵(如异常处理)。接口和虚函数将比仅仅拥有类和子类更昂贵。

我曾经看过一个很好的演讲,叫做“C++ 的低效率:事实还是虚构?”由 IAR 制作。它遍历了 C++ 的每个高级特性并为其分配了成本。它主要面向为 ARM 架构开发的人,但它对您仍然很有价值。以下是幻灯片: https://www.iar.com/globalassets/about-us/events/atc2015/inefficiencies-of-c.pdf

【讨论】:

  • 我在编译过程中使用了这两个选项,没有异常或rtti(-fno-exceptions -fno-rtti)。我确实使用命名空间虚拟函数和接口。
【解决方案2】:

琐碎的评论,除了支持 David 的建议:确保您没有在调试模式下编译,并从可执行文件中删除所有符号以将其大小减少到最小。

【讨论】:

    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    相关资源
    最近更新 更多