繁体   English   中英

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

[英]Does sequenced-before relation in C++11 prevent compiler/CPU reordering?

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

C ++ 11 关系之前引入了一个顺序 如果指令A按程序顺序出现在指令B之前,我们说A B 之前排序

int data = 0;
bool ready = 0;

// A is sequenced before B
data = 6;      // A
ready = true;  // B

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

给定任何两个评估A和B,如果A在B之前排序,则A的执行应在B的执行之前。

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

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

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

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

§1.9[intro.execution]

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

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

§1.9[intro.execution]

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM