gpt4 book ai didi

c++ - "volatile"限定符和编译器重新排序

转载 作者:IT老高 更新时间:2023-10-28 22:37:40 26 4
gpt4 key购买 nike

编译器无法消除或重新排序对 volatile 限定变量的读/写操作。

但是如果存在其他变量(可能是也可能不是volatile-qualified)的情况呢?

场景 1

volatile int a;
volatile int b;

a = 1;
b = 2;
a = 3;
b = 4;

编译器能否重新排序第一个和第二个,或者第三个和第四个赋值?

场景 2

volatile int a;
int b, c;

b = 1;
a = 1;
c = b;
a = 3;

同样的问题,编译器可以重新排序第一个和第二个,还是第三个和第四个赋值?

最佳答案

C++ 标准说 (1.9/6):

The observable behavior of the abstract machine is its sequence of reads and writes to volatile data and calls to library I/O functions.

在场景 1 中,您提出的任何更改都会更改对 volatile 数据的写入顺序。

在场景 2 中,您提出的任何更改都不会更改顺序。所以他们在“as-if”规则(1.9/1)下是允许的:

... conforming implementations are required to emulate (only) the observable behavior of the abstract machine ...

为了判断是否发生了这种情况,您需要检查机器代码、使用调试器或引发未定义或未指定的行为,这些行为的结果在您的实现中碰巧知道。例如,实现可能会保证并发执行线程具有相同内存的 View ,但这超出了 C++ 标准的范围。因此,虽然标准可能允许特定的代码转换,但特定的实现可能会将其排除在外,因为它不知道您的代码是否将在多线程程序中运行。

如果您要使用可观察的行为来测试是否发生了重新排序(例如,在上面的代码中打印变量的值),那么标准当然不允许这样做。

关于c++ - "volatile"限定符和编译器重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2535148/

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