我维护的代码在许多地方都有以下类型的行。
x = x | ((0x1 & 0x3ff) << 16);
x |= (0x7 << 28);
y = y | (0x3 << 8);
我使用-O3标志编译代码。 优化期间的编译器(gcc)是否简化并优化了涉及常量的位操作?
e.g。在第一行它应该
x = x | 0x3ff0000;
或第3行它应该
y = y | 0x300;
而不是添加指令来进行实际的位移。
答案 0 :(得分:2)
由于&amp;的所有操作数和&lt;&lt;表达式中的运算符是整型常量,这些子表达式是整型常量表达式,并将在编译时进行求值。
任何半合适的编译器都会用机器码中的硬编码常量替换这些表达式,无论优化级别如何。