2017-06-12 50 views
-3

我維護的代碼在很多地方都有以下類型的代碼。gcc優化代碼涉及位操作常量

x = x | ((0x1 & 0x3ff) << 16); 
x |= (0x7 << 28); 
y = y | (0x3 << 8); 

我用-O3標誌編譯代碼。 編譯器(gcc)在優化過程中是否簡化並優化了涉及常量的位操作?

例如在1號線它應該做的

x = x | 0x3ff0000;

或3號線它應該做的

y = y | 0x300;

,而不是添加指令來執行實際位移位。

+1

是的,這些常量表達式將在預編譯器階段展開。但是((0x1&0x3ff)<< 16)是0x10000,而不是0x3ff0000。 –

+0

......即使沒有「-O3」或任何「-O」fwiw,它也會這樣做。 – spectras

+0

你爲什麼不看看彙編代碼? – Olaf

回答

2

由於在表達式中的&和< <運營商的所有操作數都是整型常量,這些子表達式是整型常量表達式,在編譯時會得到評估。

無論優化級別如何,任何半面體編譯器都會用機器代碼中的硬編碼常量替換這些表達式。