嚴格混疊的效能優勢
.
總而言之,當不同型別的兩個指標訪問相同的位置時,編譯器不能假設資料的值(即每次讀取該值並因此無法進行優化).
這隻有當嚴格的別名不被執行時才會發生.嚴格別名選項:
> gcc:-fstrict-aliasing [default]和-fno-strict-aliasing
> msvc:
嚴格別名預設關閉.
(如果有人知道如何開啟它,
請說這樣)
例
將此程式碼複製貼上到main.c中:
void f(unsigned u) { unsigned short* const bad = (unsigned short*)&u; } int main(void) { f(5); return 0; }
然後使用以下選項編譯程式碼:
gcc main.c -Wall -O2
你會得到:
main.c:3:warning: dereferencing type-punnedpointer will break strict-aliasingrules
禁用別名:
gcc main.c -fno-strict-aliasing-Wall -O2
警告消失了. (或者只是拿出來 – 但是…不要編譯沒有它)
嘗試,因為我可能無法讓MSVC給我一個警告.