我很遗憾,当只有WORD
值仅涉及位操作时,VisualStudio 2015坚持将unsigned short
(unsigned 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 ++不应该提升。这是一个糟糕的语言选择。
答案 0 :(得分:1)
为什么value
被提升为更大的类型?因为语言规范说它是(16位unsigned short
将被转换为32位int
)。 x86上的16位操作实际上会因相应的32位操作而受到惩罚(由于前缀操作码),因此32位版本可能运行得更快。