为什么GCC可以在C11的atomic_load中省略内存屏障?



在这个简单的C11程序中

#include <stdatomic.h>
int f(atomic_int* obj) {
  return atomic_load(obj);
}

我希望生成的程序集包含内存屏障。即使负载本身可能是原子的,CPU也可能在调用过程中推测(即移动)f调用者中该内存位置的一些读取。然而,gcc -O输出:

        .file   "repro.c"
        .text
        .globl  f
        .type   f, @function
f:
.LFB0:
        .cfi_startproc
        movl    (%rdi), %eax
        ret
        .cfi_endproc
.LFE0:
        .size   f, .-f
        .ident  "GCC: (GNU) 4.9.1"
        .section        .note.GNU-stack,"",@progbits

为什么这里不需要内存屏障?

Intel文档说"读取不会与其他读取重新排序"(章节8.2.2)

GCC只在atomic_store上生成mfence指令。就我所能理解的而言,这应该足以确保其他CPU看到的写顺序与执行存储的CPU上的写顺序相同。

最新更新