我想知道在操作有符号类型时(例如,-2 >> 1
是否为-1
),检查右移是否是算术右移的最便携方式,并且需要在编译时进行。
我的想法是在编译时以某种方式检查这一点,并能够检测到它,以便我可以编译函数的不同版本(取决于运算符>>
是否真正是算术右移)。
通过阅读主题验证特定编译器的C/C++有符号右移是否为算术右移?,我想到了初始化标志的方法。
static const bool is_arithmetic_rs = (((signed int)-1)>>1) == ((signed int)-1));
并且可以像这样在运行时进行测试:
if (is_arithmetic_rs) {
// some fast algorithm using arithmetic right shifts (using >> operator)
} else {
// the same algorithm without arithmetic right shifts (much slower)
}
然而,如果可能的话,我希望每次都避免这种分支。为了简单起见,假设我想要实现一个可移植的算术右移;如果每次调用函数都必须检查这个问题,那么将会对性能产生巨大的影响,因此如果可能的话,我希望在编译时完成它。
如果没有可移植的方法来进行此检查,是否有一种方法可以通过最佳努力基础来检查,例如通过ifdefs检查特定的编译器/平台?