【发布时间】:2013-01-21 23:31:02
【问题描述】:
考虑 ANSI C 中的 while 循环,其唯一目的是延迟执行:
unsigned long counter = DELAY_COUNT;
while(counter--);
我已经看到这经常用于在嵌入式系统上强制延迟,例如。没有sleep 函数和定时器或中断是有限的。
我对 ANSI C 标准的解读是,它可以被符合标准的编译器完全删除。它没有5.1.2.3中描述的副作用:
访问 volatile 对象、修改对象、修改文件或调用执行任何这些操作的函数都是副作用,即执行环境状态的变化。
...这部分还说:
如果一个实际的实现可以推断出它的值没有被使用并且没有产生所需的副作用(包括调用函数或访问易失性对象引起的任何副作用),则它不需要评估表达式的一部分。
这是否意味着可以优化循环?即使counter 是volatile?
注意事项:
- 这与Are compilers allowed to eliminate infinite loops? 不太一样,因为它指的是无限 循环,并且会出现关于何时允许程序终止的问题。在这种情况下,程序肯定会在某个时候越过这条线,无论是否优化。
- 我知道 GCC 做了什么(删除
-O1或更高版本的循环,除非counter是volatile),但我想知道标准规定的内容。
【问题讨论】:
-
只要 可观察 行为没有改变,C 标准就不会禁止优化这个循环。所以标准没有具体规定。
标签: c optimization standards c89