gpt4 book ai didi

c++ - C++11 中的 sequenced-before 关系是否会阻止编译器/CPU 重新排序?

转载 作者:可可西里 更新时间:2023-11-01 18:29:25 24 4
gpt4 key购买 nike

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

C++11 引入了sequenced before 关系。如果指令 A 在程序顺序中出现在指令 B 之前,我们说 A sequenced before B

int data = 0;
bool ready = 0;

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

C++11 还定义了对sequenced before 关系的要求。

Given any two evaluations A and B, if A is sequenced before B, then the execution of A shall precede the execution of B.

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

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

最佳答案

因为“sequenced before”(在本例中)仅适用于单个线程:

Sequenced before is an asymmetric, transitive, pair-wise relation between evaluations executed by a single thread [...]

§1.9 [intro.execution]

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

A conforming implementation executing a well-formed program shall produce the same observable behavior as one of the possible executions of the corresponding instance of the abstract machine with the same program and the same input.

§1.9 [intro.execution]

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

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

关于c++ - C++11 中的 sequenced-before 关系是否会阻止编译器/CPU 重新排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25287484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com