c - gcc 优化涉及常量位运算的代码

标签 c gcc

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

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/

相关文章:

c - 有没有办法查看 ctype.h 中的类型中有哪些字符?

c - 如何根据架构一般指定 AX、EAX 或 RAX?

c - 64 位移位的错误答案

gcc - 为什么 GCC 提示 'sizeof' 之前缺少不存在的标识符?

c - gcc 编译器中的 outp() 对应项是什么?

c - 使用 ARM gcc 时,LD 给出奇怪的错误并且找不到现有文件

c - 试图从用户那里读取 double,出现段错误

main 中的命令行参数

c - 带有 fseek 的 open_memstream 以用零结束填充缓冲区

C switch case 值不能在 switch 内修改(不是常量)