作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近一直在为微 Controller 开发一些 C 语言嵌入式软件,该微 Controller 只有 2kB 闪存。编程即将结束时,我已经达到了代码限制。到目前为止,当发生这种情况时,我一直在提高编译器优化级别,重新测试,然后愉快地继续。然而,我最近达到了优化的极限,在添加最后一点功能后,内存再次耗尽。结果,我不得不让 George Foreman 获取我的源代码并排出一些脂肪。
我到处减少一些抽象层,这有点帮助,但还不够。接下来我看到的是函数原型(prototype)
void process_event(Event event, void *data);
它将要处理的事件和一个空指针作为其参数,可以用于向调用传递附加数据。如果我不需要任何额外的数据,我就通过了 NULL
。这个函数是在开发的早期编写的,我意识到我从未使用过 data
,所以我把它分解出来。这一更改为我节省了所需的编译代码大小(~100 字节),我想知道为什么,特别是考虑到我通常通过 NULL
当process_event
被叫了?
最佳答案
大约 100 字节可能符合这样的事实:每次调用函数时,您的调用站点都必须传递一个额外的参数 - 这至少会涉及寄存器的清除,并且根据您的芯片,存储它在调用之前就在堆栈上。
每次调用减少一条指令也有可能导致更多代码被删除,具体取决于跳转的实现方式,因为您可能会发现某些代码现在位于使用短相对偏移而不是长相对偏移。当尝试加载常量时,可以进行类似的节省。
关于c - 通过分解空指针来显着减少编译代码大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12915606/
我是一名优秀的程序员,十分优秀!