2017-06-12 27 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

由于在表达式中的&和< <运营商的所有操作数都是整型常量,这些子表达式是整型常量表达式,在编译时会得到评估。

无论优化级别如何,任何半面体编译器都会用机器代码中的硬编码常量替换这些表达式。