小编Chr*_*tix的帖子

在C中增加volatile变量

考虑以下三个表达式:

++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不保证原子性.这不是我在这里要求的 - 除非原子性本身在三者之间有所不同.

c c++ volatile language-lawyer

11
推荐指数
1
解决办法
805
查看次数

标签 统计

c ×1

c++ ×1

language-lawyer ×1

volatile ×1