问题描述
#define CONVERT(val,qin,qout) ((qin > qout) ? (val >> (qin-qout) ) : (val << (qout-qin)))
void f(void)
{
...
y = CONVERT(x,25,31);
}
GCC会在编译时评估上述宏吗?我的意思是(qin > qout)
部分。编译完成后,我尝试仅使用y = x << (31-25)
。
解决方法
在这种情况下,qin > qout
部分最终将成为整数常量,编译器可以在理论上将其优化为1
或0
。 / p>
实际上,它甚至没有这样做。看一下真正的编译器如何实际对待您的示例,-O0
处的gcc和clang(优化关闭)仅生成左移代码,省略了条件检查和分支?:
,以及第二个代码操作数永远是不正确的。
机器代码最终沸腾到y = x << 6;
的水平,完全没有分支。