為什么優化會破壞此功能?我們最近在大學里開了一個關于多種語言編程特色的講座。講師寫下了以下功能:inline u64 Swap_64(u64 x){
u64 tmp;
(*(u32*)&tmp) = Swap_32(*(((u32*)&x)+1));
(*(((u32*)&tmp)+1)) = Swap_32(*(u32*) &x);
return tmp;}雖然我完全理解這在可讀性方面也是非常差的風格,但他的主要觀點是這部分代碼在生產代碼中運行良好,直到它們實現了高優化級別。然后,代碼將什么都不做。他說,變量的所有賦值tmp都將由編譯器優化。但為什么會這樣呢?我知道有些情況下變量需要聲明為volatile,這樣編譯器就不會觸及它們,即使他認為它們永遠不會被讀或寫,但我不知道為什么會發生這種情況。
3 回答

慕哥9229398
TA貢獻1877條經驗 獲得超6個贊
在C ++中,如果指針參數char*
指向基本上不同的類型(“嚴格別名”規則),則假定它們不是別名(除外)。這允許一些優化。
在這里,u64 tmp
永遠不會被修改為u64
。
的內容u32*
被修改,而可以是無關的“ u64 tmp
”這樣可以被看作nop
用于u64 tmp
。

瀟湘沐
TA貢獻1816條經驗 獲得超6個贊
g ++(Ubuntu / Linaro 4.8.1-10ubuntu9)4.8.1:
> g++ -Wall -std=c++11 -O0 -o sample sample.cpp> g++ -Wall -std=c++11 -O3 -o sample sample.cpp sample.cpp: In function ‘uint64_t Swap_64(uint64_t)’:sample.cpp:10:19: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] (*(uint32_t*)&tmp) = Swap_32(*(((uint32_t*)&x)+1)); ^sample.cpp:11:54: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] (*(((uint32_t*)&tmp)+1)) = Swap_32(*(uint32_t*) &x); ^
Clang 3.4沒有在任何優化級別發出警告,這很奇怪 ......
- 3 回答
- 0 關注
- 487 瀏覽
添加回答
舉報
0/150
提交
取消