我正在研究一种用于微控制器的动态语言(编译成C++),作为CS的人我决定先正确地做,然后再担心优化.下面是我的对象系统的结构,
Base (Interface)
|
|---- Number (Interface)
| |
| |-- Int
| |-- Float
|
|---- Char
|
|---- Sequence (Interface)
| |
| |-- LinkedList
|
|---- Function (Interface)
|
|-- Built-in Functions (Functors)
既然一切正常,生成的代码大小开始成为一个问题,每个操作都必须用仿函数表示,(+, - while,for etc ..)所以我猜这是导致代码大小的颠簸或者我通过作为基类的所有东西然后根据需要进行转换,所以我有很多强制转换,目前一个简单的led开/关循环花费15千字节,即使它不使用所有对象类型(6个仿函数+4个整数).
我尝试了各种avr-gcc选项,但没有减少代码大小.所以我想知道如何弄清楚哪部分代码消耗了这么多空间?
在链接步骤中,您应该让avr-gcc生成一个地图文件,以便您可以查看它并查看占用太多空间的内容.
请务必使用-ffunction-sections编译选项和-Wl,-gc-sections链接器选项从二进制文件中删除未使用的函数.
您使用C++的哪些功能?其中一些(如类和命名空间)很便宜,而另一些则非常昂贵(例如异常处理).接口和虚函数比只有类和子类更昂贵.
我曾经看过一个名为"C++的低效率:事实还是虚构?"的好话.由IAR制作.它经历了C++的每个高级功能并为其分配了成本.它主要面向为ARM体系结构开发的人员,但它仍然对您有价值.以下是幻灯片:http: //www.carnica-technology.com/download/InefficiencyofC++ .pdf