【发布时间】:2018-01-14 07:10:52
【问题描述】:
正如标题,当我们在C/C++中写++a时,编译器似乎可以编译为:
inc dword ptr[i]
这是原子的, 或:
mov eax, dword ptr[i]
inc eax
mov dword ptr[i], eax
这不是原子的。
将其编译为非原子样式有什么好处吗?
【问题讨论】:
-
inc dword ptr[i]首先是不是原子的。只有使用lock前缀,它才会变成原子的——它也会变得超级慢。 -
请注意,许多 CPU 没有
inc dword ptr[i]的等价物。大多数“RISC”机器只有两种访问内存的指令:加载和存储。所有算术指令都只对寄存器中的值进行操作。 -
如果显示程序集,请考虑添加特定于平台的标签
-
不,可能不是。可能会稍微提高解码速度,但这很可能是全部。
-
x86/x64 CPU 无法按您预期的方式工作。您编写或编译器生成的指令并不是 CPU 内部执行的实际指令。它们被转换为在 CPU 的各种执行单元中调度的微操作。这些微操作可能会乱序执行,也可能会被推测执行(当有分支时,CPU 可能会执行两条条指令路径,然后丢弃原来未被采用的一条) .在 x86/64 机器代码中看不到许多正在发生的事情。 (任何人都可以推荐一个很好的介绍吗?)
标签: c++ c compiler-construction atomic