-3
我维护的代码在很多地方都有以下类型的代码。gcc优化代码涉及位操作常量
x = x | ((0x1 & 0x3ff) << 16);
x |= (0x7 << 28);
y = y | (0x3 << 8);
我用-O3标志编译代码。 编译器(gcc)在优化过程中是否简化并优化了涉及常量的位操作?
例如在1号线它应该做的
x = x | 0x3ff0000;
或3号线它应该做的
y = y | 0x300;
,而不是添加指令来执行实际位移位。
是的,这些常量表达式将在预编译器阶段展开。但是((0x1&0x3ff)<< 16)是0x10000,而不是0x3ff0000。 –
......即使没有“-O3”或任何“-O”fwiw,它也会这样做。 – spectras
你为什么不看看汇编代码? – Olaf