考虑以下三个表达式:
++x;
x += 1;
x = x + 1;
Run Code Online (Sandbox Code Playgroud)
据我所知,它们在语义上是相同的,忽略了C++中的运算符重载.然而,今天我读到了一个断言,它们是不同的,特别x是宣布时volatile.
为了测试这个断言,我写了以下内容并为PowerPC,AMD64,ARMv6和68k编译了它:
#include <stdint.h>
static volatile uint64_t x = 0;
void a(void)
{
++x;
}
void b(void)
{
x += 1;
}
void c(void)
{
x = x + 1;
}
Run Code Online (Sandbox Code Playgroud)
在所有这四个平台上,这三个函数产生相同的汇编输出,无论是在-O1还是-O3.在AMD64上,这只是两条指令:
incq _x(%rip)
retq
Run Code Online (Sandbox Code Playgroud)
因此,是有这个说法背后的真相任何?如果是这样,有什么区别,我该如何揭露它?
注意:我完全清楚这volatile不保证原子性.这不是我在这里要求的 - 除非原子性本身在三者之间有所不同.