【发布时间】:2014-09-15 11:46:06
【问题描述】:
假设A、B、a和b都是变量,A、B、a和b的地址都是不同的。然后,对于以下代码:
A = a;
B = b;
C 和 C++ 标准是否明确要求在 B=b 之前严格执行 A=a?鉴于A、B、a和b的地址都不同,是否允许编译器为了优化等目的交换两条语句的执行顺序?
如果我的问题在 C 和 C++ 中的答案不同,我都想知道。
编辑:问题的背景如下。在棋盘AI设计中,为了优化人们使用lock-less shared-hash table,如果我们不添加volatile限制,其正确性很大程度上取决于执行顺序。
【问题讨论】:
-
即使保证编译器按该顺序生成代码,CPU 本身也会乱序执行。
-
不仅编译器被允许这样做,CPU被允许这样做,内存控制器被允许这样做,缓存被允许这样做,等等。
-
任何时候你在做多线程,你都会完全进入另一个维度。即使代码是按顺序执行的,您也不能保证(没有进一步的控制)从另一个处理器来看,执行将显示为按顺序执行。如果您尝试执行类似于共享哈希表的操作,则需要花费大量时间研究同步问题。
-
@ACcreator:是的,这是可能的,具体取决于使用的特定缓存一致性协议。例如,x86 提供比 Itanium 更强的保证。对于多线程,您还需要关注撕裂和推测性写入。
-
@ACcreator:使用内存栅栏。这比临界区便宜,但仍确保缓存必须以正确的顺序同步。
标签: c++ c optimization compiler-construction standards