2014-01-21 3 views
2

В выражении типа:промежуточные значения и Потокобезопасность

a = b + c; 

Возможно ли, что компилятор оптимизирует код, чтобы сделать:

a = b; 
a += c; 

То, что я действительно хочу знать, если другие потоки может видеть результат промежуточного вычисления в переменной на левой стороне от =.

+0

Хммм, я не знаю, но я очень сомневаюсь. – Doorknob

+0

Это о C++ 11? Существуют ли какие-либо атомные переменные? – dyp

+1

На общих архитектурах нет инструкции добавления, которая нацелена на память; он должен пройти через регистр, а затем вернуть результат в память, поэтому я не вижу причин для компилятора, когда-либо сделавшего это. Однако я не уверен в гарантиях стандарта. –

ответ

1

С помощью правила as-if оптимизирующий компилятор может (почти) использовать все, что ему нравится, с выражениями, которые не включают атомарность, поскольку другой поток не может наблюдать разницу в программе, свободной от данных. Так что да, компилятор мог это сделать, а другие потоки могли видеть только промежуточный результат через гонку данных.

-1

не имеют доступа к стандарту прямо сейчас, но в соответствии с http://en.cppreference.com/w/cpp/language/eval_order:

8) Побочный эффект (изменение левого аргумента) встроенного в оператора присваивания и всех встроенные операторы присваивания секвенированы после вычисления значения (но не побочных эффектов) как левого, так и правого аргументов и секвенированы до значения вычисление выражения присваивания (то есть перед возвратом ссылка на модифицированный объект)

Это, по-видимому, означает, что модификация a секвенирована после оценки b + c, поэтому компилятор не может изменить a в два этапа.

Это не мешает оптимизатору делать все, что угодно, но я не вижу никакой причины, чтобы он записывал в a дважды.

Смежные вопросы