gpt4 book ai didi

c - 有哪些重构方法可以减少编译代码的大小?

转载 作者:IT王子 更新时间:2023-10-28 23:31:12 25 4
gpt4 key购买 nike

我有一个需要新功能的旧版固件应用程序。应用程序的大小已经接近设备有限的闪存容量,少数新功能和变量将其推到了边缘。打开编译器优化可以解决问题,但客户对此持谨慎态度,因为他们过去曾导致失败。那么,在重构 C 代码以产生更小的输出时,需要注意哪些常见问题?

最佳答案

  • 尽可能使用生成函数而不是数据表
  • 禁用内联函数
  • 把常用的宏变成函数
  • 为大于 native 机器大小的变量降低分辨率(即 8 位微,尝试摆脱 16 位和 32 位变量 - 将某些代码序列加倍和加倍)
  • 如果 micro 具有较小的指令集(Arm thumb),请在编译器中启用它
  • 如果内存是分段的(即分页或非线性),那么
    • 重新排列代码,以便需要使用更少的全局调用(更大的调用指令)
    • 重新排列代码和变量使用以消除全局内存调用
    • 重新评估全局内存使用情况 - 如果可以将其放在堆栈上,那就更好了
  • 确保在关闭调试的情况下进行编译 - 在某些处理器上会有很大的不同
  • 压缩无法即时生成的数据 - 然后在启动时解压缩到 ram 中以便快速访问
  • 深入研究编译器选项 - 可能每个调用都是自动全局的,但您可以安全地逐个文件禁用它以减小大小(有时显着)

如果您仍然需要比打开 compile with optimizations 更多的空间,请查看生成的程序集与未优化的代码。然后重新编写发生最大变化的代码,以便编译器在关闭优化的情况下根据棘手的 C 重写生成相同的优化。

例如,您可能有多个进行类似比较的“if”语句:

if(A && B && (C || D)){}
if(A && !B && (C || D)){}
if(!A && B && (C || D)){}

然后创建一个新变量并提前进行一些比较将使编译器免于重复代码:

E = (C || D);

if(A && B && E){}
if(A && !B && E){}
if(!A && B && E){}

如果您打开它,这是编译器自动为您执行的优化之一。还有很多很多其他的,如果您想学习如何在 C 代码中手动执行此操作,您可以考虑阅读一些编译器理论。

关于c - 有哪些重构方法可以减少编译代码的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/662439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com