在C++ 11中排序之前的关系会阻止编译器/ CPU重新排序吗?

Eri*_*c Z 7 c++ language-lawyer c++11

我知道,现代C++编译器和处理器通常会通过重新排序指令来执行某些优化,以获得更好的性能.

C++ 11 关系之前引入了一个顺序.如果指令在程序顺序的指令A之前到来B,我们说之前A顺序的 B.

int data = 0;
bool ready = 0;

// A is sequenced before B
data = 6;      // A
ready = true;  // B
Run Code Online (Sandbox Code Playgroud)

C++ 11还定义了关系之前排序的要求.

给定任何两个评估A和B,如果A在B之前被排序,那么A的执行应该在B的执行之前.

这让我很困惑.对我而言,它与无序执行相冲突,因为重新排序可能会破坏上述所需的属性.例如,当商店ready发生在商店之前data.

上面的定义是否会停止指令重新排序?(我很确定不是.但是我错过了什么?)

Rob*_*ahy 8

由于"在之前排序"(在本例中)仅适用于单个线程:

之前排序的是由单个线程执行的评估之间的不对称,传递,成对关系[...]

§1.9[intro.execution]

并且由于编译器/ CPU可以执行他们希望的任何转换,只要代码执行符合标准:

执行格式良好的程序的一致实现应该产生与具有相同程序和相同输入的抽象机的相应实例的可能执行之一相同的可观察行为.

§1.9[intro.execution]

任意重新排序可能(或可能不)发生.

请注意,线程之间应用特殊规则.见§1.10[intro.multithread].