Рассмотрим следующие три выражения:
++x;
x += 1;
x = x + 1;
Насколько мне известно, они идентичны по семантике, если не учитывать перегрузку операторов в 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;
}
На всех четырех этих платформах три функции генерировали одинаковый вывод на ассемблере, будь то -O1 или -O3. На AMD64 это было всего две инструкции:
incq _x(%rip)
retq
Следовательно, есть ли правда в этом утверждении? Если да, то в чем разница, и как я могу это выставить?
NB: я прекрасно понимаю, что volatile
не гарантирует атомарности. Это не то, о чем я спрашиваю здесь - если только сама атомарность не является тем, что отличается между тремя.
The operand of prefix ++ is modified by adding 1, or set to true if it is bool (this use is deprecated).
, поэтому он строго не эквивалентен и является устаревшим использованием. 22.09.2015y[x] = y[x] + 1
выполняются конвейерно на платформах RISC, так что выборкаx
для обоих происходит до выборкиy[x]
. 22.09.2015y[x] = y[x] + 1
не имеет ничего общего сx = x + 1
. 22.09.2015