2014-01-21 15 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兩次。