为什么C/C++编译器并不总是使++成为原子?

Lou*_*uis 5 c c++ compiler-construction atomic

作为标题,当我们写入++aC/C++,似乎编译器可以将其编译为:

inc dword ptr[i]
Run Code Online (Sandbox Code Playgroud)

这是原子的,或者:

mov eax,  dword ptr[i]
inc eax
mov dword ptr[i], eax
Run Code Online (Sandbox Code Playgroud)

这不是原子的.

将它编译为非原子样式有什么好处吗?

Sil*_*olo 9

如果您的代码看起来像这样怎么办?

++a;
if (a > 1) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果编译器使用第一个表示,它访问内存以递增a,然后它再次访问内存以进行比较1.在第二种情况下,它访问内存以获取值一次并将其放入eax.然后,它只是寄存器比较eax反对1,这是显著更快.


Sor*_*tir 0

非原子变体最终将值存储在寄存器中以供以后使用。