не имеют доступа к стандарту прямо сейчас, но в соответствии с http://en.cppreference.com/w/cpp/language/eval_order:
8) Побочный эффект (изменение левого аргумента) встроенного в оператора присваивания и всех встроенные операторы присваивания секвенированы после вычисления значения (но не побочных эффектов) как левого, так и правого аргументов и секвенированы до значения вычисление выражения присваивания (то есть перед возвратом ссылка на модифицированный объект)
Это, по-видимому, означает, что модификация a
секвенирована после оценки b + c
, поэтому компилятор не может изменить a
в два этапа.
Это не мешает оптимизатору делать все, что угодно, но я не вижу никакой причины, чтобы он записывал в a
дважды.
Хммм, я не знаю, но я очень сомневаюсь. – Doorknob
Это о C++ 11? Существуют ли какие-либо атомные переменные? – dyp
На общих архитектурах нет инструкции добавления, которая нацелена на память; он должен пройти через регистр, а затем вернуть результат в память, поэтому я не вижу причин для компилятора, когда-либо сделавшего это. Однако я не уверен в гарантиях стандарта. –