C90 兼容编译器是否必须考虑 CPU 的指令重新排序?

问题描述 投票:0回答:1

考虑以下代码:

volatile int a;
volatile int b;
int x;

void func() {
    a = 1;
    x = 0; /* dummy statement */
    b = 2;
}

在此代码片段中,对 x 的赋值构成了一个序列点。因此,根据C90标准,对易失性变量a的访问必须在开始对b的访问之前完成。将这段代码翻译为 x86-64 汇编程序时,函数体翻译如下:

movl $1, a(%rip)
movl $0, x(%rip)
movl $2, b(%rip)

现在,当执行这段代码时,CPU可能会对内存访问重新排序,从而打破了C标准中对a和b的访问按顺序执行的要求。那么,这个翻译是不是不正确,编译器是否必须插入内存屏障来强制排序?

编辑: 考虑 a 和 b 是两个线程共享的变量的情况。在这种情况下,两个线程之间的同步协议可能依赖于对a和b的访问按顺序发生的事实。因此,当 CPU 对访问重新排序时,这可能会破坏该协议(我实际上并没有尝试实现这样的协议,我只是想知道 C 标准的正确解释是什么)。

c assembly standards
1个回答
6
投票

CPU 可能会重新排序指令,但它们必须确保 结果与没有重新排序时相同。

© www.soinside.com 2019 - 2024. All rights reserved.