關於指令重排序有個問題不明白的一個問題多線程
int a = 2; int c = 1 + a; float b = 3f / 2f;
舉個栗子,從CPU的設計者以及編譯器的設計者角度來看,上面第3行代碼徹底能夠放到第1行代碼以前運行,且不會影響程序的正確性(as-if-serial)。線程
float b = 3f / 2f; 從處理器的角度來看,若是當前處理器在執行第2行代碼(CPU處於佔用狀態),而接下來這第3行代碼的運算徹底能夠交給FPU(FPU處於空閒狀態),那麼何樂而不爲 先把第3行代碼提交給FPU(浮點運算器)去執行呢,反正結果出來以後,並不會影響程序的正確性,並且相比一行一行運行代碼,閒置的FPU 提早加入運算工做能夠明顯減小程序運行的總時間,由於FPU跟CPU能夠並行。設計
從多線程的角度來看,下面這行代碼就會存疑,由於單線程的as-if-serial 在多線程下運行的時候就會產生意想不到的錯誤。code
if (b == (3f/2f)){ assert c==3; }