我正在维护的代码在很多地方都有以下类型的行。
x = x | ((0x1 & 0x3ff) << 16);
x |= (0x7 << 28);
y = y | (0x3 << 8);
我使用 -O3 标志编译代码。 编译器(gcc)在优化期间是否简化和优化了涉及常量的位操作?
例如在第一行应该这样做
x = x | 0x3ff0000;
或者在第三行应该这样做
y = y | 0x300;
而不是添加指令来进行实际的位移。
最佳答案
由于表达式中 & 和 << 运算符的所有操作数都是整型常量,因此这些子表达式是整型常量表达式,并且将在编译时进行计算。
任何不太好的编译器都会用机器代码中的硬编码常量替换这些表达式,无论优化级别如何。
关于c - gcc 优化涉及常量位运算的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44497253/