C – 编译器优化如何影响没有主体的for循环?

我有一些遗留代码,其中包含了一个时间浪费循环,以便有时间让eeprom读取完成(不良做法):

for(i = 0; i < 50; i++); 

但是,当编译器优化开启以获得速度时,会发生特殊情况。 它不一定与该语句相关联,但我想知道编译器是否可能只是优化时间延迟

这取决于i的类型。 如果它只是一个普通的整数类型,不能在循环内部使用,则没有副作用,编译器可以自由地优化整个事物。

但是如果你声明ivolatile ,那么编译器就会被迫生成代码,在循环的每一圈都增加变量并读取它。

这是为什么你不应该在嵌入式系统中使用像这样的“烧毁”循环的众多原因之一。 您还占用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值以匹配先前的时间(如果有必要)