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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么C / C ++编译器并不总是使++成为原子?相关的知识,希望对你有一定的参考价值。

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

inc dword ptr[i]

这是原子的,或者:

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

这不是原子的。

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

答案

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

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

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

另一答案

首先,您似乎有一个非常特殊的处理器系列。并非所有都有一个直接作用于内存的指令。

即使他们拥有,这种单一指令也可能是一件非常复杂和昂贵的事情。如果你声称它真的是原子的,它必须停止所有其他的公共汽车转移。这会将计算速度降低到内存总线的速度。这通常比CPU慢。

另一答案

非原子变体将寄存器中的值结束,以备将来使用。

以上是关于为什么C / C ++编译器并不总是使++成为原子?的主要内容,如果未能解决你的问题,请参考以下文章

MSVS/C++:不会被优化掉的最快的总是假的条件?

C ++中的变量范围

为啥我在写C语言的头文件,编译时会出现重新定义变量的情况?

当类型转换为 int 时,C/C++ bool 类型是不是总是保证为 0 或 1?

使用vc将C的代码封装成为DLL

LaTeX中如何定义使\section编译之后显示第一章,第二章这种