gcc优化代码涉及使用常量的位操作

时间:2017-06-12 10:30:16

标签: c gcc

我维护的代码在许多地方都有以下类型的行。

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

我使用-O3标志编译代码。 优化期间的编译器(gcc)是否简化并优化了涉及常量的位操作?

e.g。在第一行它应该

x = x | 0x3ff0000;

或第3行它应该

y = y | 0x300;

而不是添加指令来进行实际的位移。

1 个答案:

答案 0 :(得分:2)

由于&amp;的所有操作数和&lt;&lt;表达式中的运算符是整型常量,这些子表达式是整型常量表达式,并将在编译时进行求值。

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