考虑 ANSI C 中的一个 while 循环,其唯一目的是延迟执行:
unsigned long counter = DELAY_COUNT;
while(counter--);
我已经看到这在嵌入式系统上被大量使用来强制延迟,例如。没有sleep
功能,定时器或中断是有限的。
我对 ANSI C 标准的解读是,这可以通过符合标准的编译器完全删除。它没有5.1.2.3中描述的副作用:
访问 volatile 对象、修改对象、修改文件或调用执行任何这些操作的函数都是副作用,它们是执行环境状态的变化。
...这部分还说:
如果一个实际的实现可以推断出它的值没有被使用并且没有产生所需的副作用(包括调用函数或访问易失性对象引起的任何副作用),则它不需要评估表达式的一部分。
这是否意味着可以优化循环?即使counter
是volatile
?
笔记:
- 这与允许编译器消除无限循环不完全相同吗?,因为这指的是无限循环,并且关于何时允许程序终止的问题出现了。在这种情况下,程序肯定会在某个时候越过这条线,无论是否优化。
- 我知道 GCC 做了什么(删除循环 for
-O1
或更高,除非counter
isvolatile
),但我想知道标准规定了什么。