【问题标题】:Is loop in C guaranteed to be executed in order?C中的循环是否保证按顺序执行?
【发布时间】:2013-07-06 04:08:02
【问题描述】:

ANSI-C 中的“for”循环是否保证按顺序执行,或者编译器是否可以使用乱序执行对其进行优化? 如果是这样,哪些编译器会这样做?在哪个优化级别?如何防止这种优化?

【问题讨论】:

  • 理论上,如果代码被“神奇地”并行化,并且每个线程以不同的速度运行,则循环可能会乱序执行。我不得不考虑调试这种情况会有多难看......
  • 不允许优化改变正确程序的顺序行为。所以不,你不必担心。

标签: c loops optimization


【解决方案1】:

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

【讨论】:

  • 据我所知 volatile 是对编译器的一个提示,一个值可能会在代码的职责范围之外发生变化(例如,通过并行进程或硬件),从而禁用可能有问题的优化。所以我认为这也意味着必须保留读取和写入的顺序(这对特殊功能寄存器有意义)。是这样吗?也许您知道使用乱序优化的编译器(可能还有示例)?
  • @theldoria C 对涉及 volatile 限定对象的表达式提出了要求:(C99, 6.7.3p6) “一个具有 volatile 限定的对象 [...]。因此,任何引用此类对象应严格按照抽象机的规则进行评估,如 5.1.2.3 中所述。”(C99, 5.1.2.3p8) “示例 1 一个实现可能定义一个抽象语义和实际语义之间的一一对应:在每个序列点,实际对象的值将与抽象语义指定的值一致。关键字 volatile 将是多余的。”
  • @theldoria: 对volatile 的写入和读取符合条件的对象被认为是程序可观察行为的一部分,因此相对于其他可观察行为,它们必须按照程序顺序完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多