如何避免按位运算的整体提升

时间:2016-11-29 18:31:17

标签: c++ bitwise-operators integer-promotion

我很遗憾,当只有WORD值仅涉及位操作时,VisualStudio 2015坚持将unsigned shortunsigned int)推广到WORD。 (即当做16bit | 16bit时,将16位提升到32位)。

e.g。

// where WORD is a 'unsigned short'
const WORD kFlag = 1;
WORD old = 2;
auto value = old | kFlag;  // why the blazes is value an unsigned int (32 bits)

此外,有没有办法获得WORD|WORD的0x86内在函数?我当然不想支付(16-> 32 | 16->) - > 16。此代码也不需要消耗超过几个16位寄存器,而不是几个32位寄存器。

但注册表的使用实际上只是暂时的。欢迎优化器随心所欲,只要结果对我来说难以区分。 (即它不应以可见的方式改变大小。)

对我来说,主要的问题是使用标志| kFlagValue导致更宽的实体,然后将其抽入模板会给我一个类型不匹配错误(模板比我想进入的模型要长得多,但关键点是否需要两个参数,它们应该在类型上匹配,或者可以简单地转换,但由于这种自动大小提升规则,它们不是。)

如果我可以访问“保守位处理函数集”,那么我可以使用:

      flag non-promoting-bit-operator kFlagValue

实现我的目标。

我想我必须去写那个,或者在整个地方使用演员表,因为这个不幸的规则。

在这种情况下,C ++不应该提升。这是一个糟糕的语言选择。

1 个答案:

答案 0 :(得分:1)

为什么value被提升为更大的类型?因为语言规范说它是(16位unsigned short将被转换为32位int)。 x86上的16位操作实际上会因相应的32位操作而受到惩罚(由于前缀操作码),因此32位版本可能运行得更快。