ANSI-C中的'for'循环保证按顺序执行,还是可以通过编译器使用乱序执行来优化? 如果是这样,哪些编译器这样做?在哪个优化级别?如何防止这种优化?C中的循环是否保证按顺序执行?
回答
如果编译器能够确定它不会改变程序的可观察行为,编译器有权执行乱序执行。如果要严格按照C抽象机器的规则执行语句,请使用volatile
对象。
据我所知,volatile是编译器的一个提示,一个值可能会在代码的责任范围之外发生变化(例如通过并行进程或硬件),从而禁用可能存在问题的优化。 所以我认为这也意味着读写顺序必须保留(这对于特殊功能寄存器是有意义的)。是这样吗? 也许你知道一个使用无序优化的编译器(可能是一个例子)? – theldoria
@theldoria C对涉及volatile限定对象的表达式施加了要求:*(C99,6.7.3p6)“具有volatile限定的对象。因此,任何涉及这样的对象的表达式应严格按照抽象机器的规则,如5.1.2.3。“*和*(C99,5.1.2.3p8)”中所述。示例1一个实现可以定义抽象语义和实际语义之间的一一对应关系:在每个序列点,那么实际对象的值将与抽象语义所指定的值一致,关键字volatile将会是多余的。“* – ouah
@theldoria:写入和读取到'volatile'限定对象被认为是可观察行为的一部分该程序,因此,他们必须按照其他可观察行为的程序顺序完成。 – caf
- 1. 在循环字符串时是否保证执行顺序?
- 2. 循环中的异步请求是否按照循环执行的顺序保证排队?
- 3. Session.run(fetches)是否保证按顺序执行它的“fetches”参数?
- 4. 循环是在gpu上按顺序还是并行执行?
- 5. 运行循环中的执行顺序
- 6. Task.Factory.StartNew保证执行顺序
- 7. do/while循环中的执行顺序
- 8. 睡眠的使用是否保证线程的执行顺序?
- 9. 集合上的高阶函数是否保证顺序执行?
- 10. python代码是否按顺序执行
- 11. 可调用是否按顺序执行?
- 12. 的NodeJS事件循环执行顺序
- 13. 是否确保UPDATE按给定顺序执行SET赋值?
- 14. 并行或按顺序执行foreach循环给定条件
- 15. JavaScript for'循环中的执行顺序是什么?
- 16. 无法顺序执行循环
- 17. C++:按字母顺序循环
- 18. 并行执行每个循环的顺序执行
- 19. 是否保证SKNode.nodesAtPoint的顺序?
- 20. std :: list的顺序是否有保证?
- 21. FieldInfo [] Type.GetFields()的顺序是否有保证?
- 22. 是否保证KeyListeners的调用顺序?
- 23. 是否IList <>保证C#中添加项的顺序
- 24. 是否有一个保证C#中FIFO顺序的同步类?
- 25. 是否保证在PHP中按照数组顺序迭代foreach?
- 26. bash for循环中的迭代次序是否有保证?
- 27. for循环闪烁htmlOutput不按顺序执行
- 28. 是NSArray for循环枚举顺序保证?
- 29. PowerShell中的Foreach循环不按顺序
- 30. JavaScript for循环执行的确切顺序是什么?
理论上讲,如果代码“神奇地”并行化,并且每个线程以不同的速度运行,循环可能会乱序执行。我不得不认为调试这种情况有多难看...... –
优化不允许改变正确程序的顺序行为。所以不,你不必担心。 – Mysticial