如何避免按位运算的积分提升

Mor*_*hai 8 c++ bitwise-operators integer-promotion

我很惊讶 VisualStudio 2015 坚持将WORD( unsigned short) 提升为 anunsigned int当仅WORD值涉及仅位操作时。(即在执行 16bit | 16bit 时将 16 位提升到 32 位)。

例如

// 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)
Run Code Online (Sandbox Code Playgroud)

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

但注册表的使用实际上只是一个旁白。欢迎优化器为所欲为,只要结果对我来说是无法区分的。(即它不应该以可见的方式改变大小)。

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

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

      flag non-promoting-bit-operator kFlagValue
Run Code Online (Sandbox Code Playgroud)

为了达到我的目的。

我想我必须去写那个,或者到处使用强制转换,因为这个不幸的规则。

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

120*_*arm 2

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

  • 啊 - 这应该是你问题的一部分,因为我完全错过了为什么这让你烦恼。我以为你会受到性能限制,而不是与模板处理器对抗。 (4认同)