2013-07-08 31 views
0

ANSI-C中的'for'循环保证按顺序执行,还是可以通过编译器使用乱序执行来优化? 如果是这样,哪些编译器这样做?在哪个优化级别?如何防止这种优化?C中的循环是否保证按顺序执行?

+0

理论上讲,如果代码“神奇地”并行化,并且每个线程以不同的速度运行,循环可能会乱序执行。我不得不认为调试这种情况有多难看...... –

+5

优化不允许改变正确程序的顺序行为。所以不,你不必担心。 – Mysticial

回答

3

如果编译器能够确定它不会改变程序的可观察行为,编译器有权执行乱序执行。如果要严格按照C抽象机器的规则执行语句,请使用volatile对象。

+0

据我所知,volatile是编译器的一个提示,一个值可能会在代码的责任范围之外发生变化(例如通过并行进程或硬件),从而禁用可能存在问题的优化。 所以我认为这也意味着读写顺序必须保留(这对于特殊功能寄存器是有意义的)。是这样吗? 也许你知道一个使用无序优化的编译器(可能是一个例子)? – theldoria

+1

@theldoria C对涉及volatile限定对象的表达式施加了要求:*(C99,6.7.3p6)“具有volatile限定的对象。因此,任何涉及这样的对象的表达式应严格按照抽象机器的规则,如5.1.2.3。“*和*(C99,5.1.2.3p8)”中所述。示例1一个实现可以定义抽象语义和实际语义之间的一一对应关系:在每个序列点,那么实际对象的值将与抽象语义所指定的值一致,关键字volatile将会是多余的。“* – ouah

+0

@theldoria:写入和读取到'volatile'限定对象被认为是可观察行为的一部分该程序,因此,他们必须按照其他可观察行为的程序顺序完成。 – caf

相关问题