在这个简单的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上的写顺序相同。