根据 cppreference,一个volatile限定变量的存储不能重新排序为另一个volatile限定变量。换句话说,在下面的示例中,当 y 变为 20 时,可以保证 x 为 10。
volatile int x, y;
...
x = 10;
y = 20;
Run Code Online (Sandbox Code Playgroud)
根据维基百科,ARM 处理器的一个存储可以在另一个存储之后重新排序。因此,在下面的示例中,第二个存储可以在第一个存储之前执行,因为两个目的地是不相交的,因此它们可以自由地重新排序。
str r1, [r3]
str r2, [r3, #4]
Run Code Online (Sandbox Code Playgroud)
有了这样的理解,我写了一个玩具程序:
volatile int x, y;
int main() {
x = 10;
y = 20;
}
Run Code Online (Sandbox Code Playgroud)
我预计生成的程序集中会出现一些围栏,以保证 x 和 y 的存储顺序。但为 ARM生成的程序集是:
main:
movw r3, #:lower16:.LANCHOR0
movt r3, #:upper16:.LANCHOR0
movs r1, #10
movs r2, #20
movs r0, #0
str r1, [r3]
str r2, [r3, #4] …Run Code Online (Sandbox Code Playgroud)