我最近一直在开发一些C语言的嵌入式软件,用于微控制器,它只有2kB的闪存。即将结束编程,我一直在触及代码限制。直到现在,当这种情况发生时,我一直在提高编译器优化的水平,重新测试,然后愉快地继续。但是,最近我达到了优化的极限,并增加了最后一点功能,再次耗尽内存。结果,我不得不让乔治福尔曼出现在我的源代码中,并耗尽一些脂肪。通过分解无效指针大幅降低编译代码大小
我在这里和那里减少了一些抽象层,这有点帮助了一些事情,但还不够。我看到了接下来的事情是,我不得不函数原型
void process_event(Event event, void *data);
其作为它的参数来处理事件和可以用来传递额外的数据呼叫空指针。如果我不需要任何额外的数据,我通过了NULL
。这个功能很早就写在开发中,我意识到我从来没有使用过data
,所以我将它分解了。这一个改变给我编译的代码大小节省了我需要的(〜100字节),我想知道为什么,特别是考虑到我通常在调用process_event
时通过NULL
?
函数调用了多少次?通过删除参数实现的代码节省是多少? – simonc
该功能被称为相当数量(> 10倍)。 –
这可能很大程度上取决于“事件”,它的大小和结构。您可能会遇到您的体系结构的边界,其中额外的参数会对调用约定进行更改。没有'数据'“全部在寄存器中”,“溢出堆栈”或类似的东西。 –