下面的代码示例来自一个中文博客,介绍了volatile
. 左边是C代码;另一个是生成的汇编代码。
// cordering.c gcc -O2 -S -masm=intel cordering.c
int A;
volatile int B;
void foo() mov eax, DWORD PTR B[rip]
{ mov DWORD PTR B[rip], 0
A = B + 1; add eax, 1
B = 0; mov DWORD PTR A[rip], eax
} ret
正如我们在汇编代码中看到的, 的副作用A
放在 的 副作用之后B
,即使B
是volatile
合格的。但是,cppreference.com 说:
[W]在单个执行线程中,不能优化或重新排序易失性访问,并使用另一个可见的副作用,即先排序或先排序后易失性访问。
这里的副作用A
是在之前排序的B
,所以我认为编译器这样做是非法的。我对吗?
作为补充,博客说如果我们要保证 avolatile
和non-volatile
type 之间的顺序,我们需要同时做volatile
:
// cordering.c gcc -O2 -S -masm=intel cordering.c
volatile int A;
volatile int B;
void foo() mov eax, DWORD PTR B[rip]
{ add eax, 1
A = B + 1; mov DWORD PTR A[rip], eax
B = 0; mov DWORD PTR B[rip], 0
} ret