在这个简单的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
为什么这里不需要记忆障碍?
答案 0 :(得分:1)
英特尔文档说"Reads are not reordered with other reads" (section 8.2.2)
GCC仅在mfence
上生成atomic_store
指令。至于我可以绕过它,这应该足以确保其他CPU看到的写入顺序与执行存储的CPU上的写入顺序相同。