C++11原子类型:是否在寄存器缓存可重复读,还是仅保证原子性?
C++11原子类型的重复读行为:缓存还是仅保证原子性?
针对问题:C++11中的原子类型是否会将可重复读操作缓存到寄存器中?还是仅保证原子性(即读操作不会被拆分为多个部分)?
结论是:MSVC++、clang++/clang-cl以及g++在使用memory_order_relaxed内存序的情况下,不会对原子读操作进行寄存器缓存——每一次load都会直接从内存(或缓存一致性协议维护的缓存)中读取,而非复用之前加载到寄存器的值。
以下是测试代码:
#include <atomic> using namespace std; int x( atomic_int const &ai ) { int a = ai.load( memory_order_relaxed ), b = ai.load( memory_order_relaxed ); return a + b; }
g++编译生成的汇编
movl (%rdi), %edx movl (%rdi), %eax addl %edx, %eax ret
clang-cl编译生成的汇编
mov eax, dword ptr [rcx] add eax, dword ptr [rcx] ret
MSVC(cl)编译生成的汇编
mov edx, DWORD PTR [rcx] mov eax, DWORD PTR [rcx] add eax, edx ret 0
内容的提问来源于stack exchange,提问作者Edison von Myosotis
相关产品推荐
相关产品推荐

