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

标签 c++ c compiler-construction atomic

如题,当我们在C/C++中编写++a时,编译器似乎可能将其编译为:

inc dword ptr[i]

这是原子的, 或者:

mov eax,  dword ptr[i]
inc eax
mov dword ptr[i], eax

这不是原子的。

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

最佳答案

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

++a;
if (a > 1) {
  ...
}

如果编译器使用第一种表示,它会访问内存以递增a,然后再次访问内存以与1 进行比较。在第二种情况下,它访问内存一次获取值并将其放入eax。然后它简单地将寄存器 eax1 进行比较,这明显更快。

关于c++ - 为什么 C/C++ 编译器并不总是使++ 成为原子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48247420/

相关文章:

c++ - 将对象作为参数传递给 createProcess 的问题

c - 二进制 + 的无效操作数(具有 'float*' 和“float*”)

c - C 和汇编器中的阶乘 - 递归

c++ - 英特尔 C++ 编译器是否优化了代码中从未调用过的函数?

c - 在字节码中存储值

c++ - 如何使智能指针指向对象的拷贝

c++ - 获取 char 中的位数

c++ - Eclipse CDT 无法构建 - 不确定出了什么问题(包括控制台)

c - 面试-位操作

iphone - -ObjC 链接器标志有什么作用?