考虑 ANSI C 中的 while 循环,其唯一目的是延迟执行:
unsigned long counter = DELAY_COUNT;
while(counter--);
我已经看到这在嵌入式系统上被大量使用来强制延迟,例如。没有sleep
功能和定时器或中断是有限的。
我对 ANSI C 标准的理解是,符合标准的编译器可以完全删除它。它没有任何描述的副作用5.1.2.3:
访问易失性对象、修改对象、修改文件或调用执行任何这些操作的函数都是副作用,即执行环境状态的变化。
...这一部分还说:
如果实际实现可以推断出其值未被使用并且不会产生所需的副作用(包括由调用函数或访问易失性对象引起的任何副作用),则实际实现不需要评估表达式的一部分。
这是否意味着循环可以被优化?即使counter
were volatile
?
Notes:
- 这与编译器是否允许消除无限循环? https://stackoverflow.com/questions/2178115/are-compilers-allowed-to-eliminate-infinite-loops,因为那指的是infinite循环,并且出现关于何时允许程序终止的问题。在这种情况下,程序肯定会在某个时刻越过这条线,无论是否优化。
- 我知道 GCC 是做什么的(删除循环
-O1
或更高,除非counter
is volatile
),但我想知道标准规定了什么。
C 标准遵从性遵循“as-if”规则,通过该规则,编译器可以生成任何行为“就像”在抽象机上运行实际指令的代码。由于不执行任何操作具有与执行循环相同的可观察行为,因此完全允许不为其生成代码。
换句话说,在真实机器上计算所需的时间并不是程序“可观察”行为的一部分,它只是特定实现的一种现象。
情况有所不同volatile
变量,因为访问易失性被视为“可观察”的效果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)