在 Visual C++ 2013 中,当我编译以下代码时:
我不太理解:为什么对于一个
这是有原因的,还是因为没有考虑去掉它的优化?
*我使用了
#include <atomic>
int main()
{
std::atomic<int> v(2);
return v.fetch_add(1, std::memory_order_relaxed);
}
我在x86上得到以下汇编代码:
51 push ecx
B8 02 00 00 00 mov eax,2
8D 0C 24 lea ecx,[esp]
87 01 xchg eax,dword ptr [ecx]
B8 01 00 00 00 mov eax,1
F0 0F C1 01 lock xadd dword ptr [ecx],eax
59 pop ecx
C3 ret
同样地,在x64上:
B8 02 00 00 00 mov eax,2
87 44 24 08 xchg eax,dword ptr [rsp+8]
B8 01 00 00 00 mov eax,1
F0 0F C1 44 24 08 lock xadd dword ptr [rsp+8],eax
C3 ret
我不太理解:为什么对于一个
int
变量进行轻松的递增需要加lock
前缀?这是有原因的,还是因为没有考虑去掉它的优化?
*我使用了
/O2
和/NoDefaultLib
来减小文件大小并消除不必要的C运行时代码,但这与问题无关。
atomic
的实现本身必然是不可移植的。 - user541686inc [mem]
也不是原子操作。我们已经不再处于单核时代了。 - haroldmov
加载来进行var.load(relaxed)
(或seq_cst)操作。请参阅Can num ++ be atomic for 'int num'?。 - Peter Cordes