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++ 不应该提升。这是一个糟糕的语言选择。
为什么value提升为更大的类型?因为语言规范是这么说的(16 位unsigned short将转换为 32 位int)。x86 上的 16 位操作实际上会比相应的 32 位操作受到惩罚(由于前缀操作码),因此 32 位版本可能运行得更快。
| 归档时间: |
|
| 查看次数: |
945 次 |
| 最近记录: |