我有一些遗留代码,其中包含了一个时间浪费循环,以便有时间让eeprom读取完成(不良做法):
for(i = 0; i < 50; i++);
但是,当编译器优化开启以获得速度时,会发生特殊情况。 它不一定与该语句相关联,但我想知道编译器是否可能只是优化时间延迟
这取决于i
的类型。 如果它只是一个普通的整数类型,不能在循环内部使用,则没有副作用,编译器可以自由地优化整个事物。
但是如果你声明i
是volatile
,那么编译器就会被迫生成代码,在循环的每一圈都增加变量并读取它。
这是为什么你不应该在嵌入式系统中使用像这样的“烧毁”循环的众多原因之一。 您还占用100%的CPU并消耗100%的电流。 并且您在系统时钟和循环之间创建紧密耦合,这不一定是线性的。
专业的解决方案始终是使用片上硬件定时器而不是“烧坏”循环。
Lundin的回答解释了为什么它发生得恰到好处,所以不需要解释。
也就是说,如果你真的需要保持循环中的旧行为但优化其余部分,最简单的方法是将这个主动延迟循环放在一个文件中的一个函数中:
#include // the corresponding header file void active_delay(int d) { // do not build with optimize flags on! int i; for(i = 0; i < d; i++); }
并在没有任何优化标志的情况下构建此文件。
通过优化标志构建其余代码,以便从“普通”代码的优化器中受益。
请注意,由于函数调用开销和循环的执行时间非常短,因此当从内联调用移动到单独的目标文件中的函数时,延迟会略微增加。
您可能希望减小d
值以匹配先前的时间(如果有必要)
以上就是c/c++开发分享C – 编译器优化如何影响没有主体的for循环?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/545794.html