【问题标题】:Type of RHS operand in bitwise shift of unsigned types无符号类型的按位移位中 RHS 操作数的类型
【发布时间】:2014-04-01 17:23:09
【问题描述】:

我想将无符号类型(例如 size_t)向左/右移动非负数(二进制)数字/位置,例如

size_t x;
x << non_const_expr

假设non_const_expr 的值适合(unsigned) intnever 会导致未定义的行为(其值为非负数且不超过x 中的位数)。 (请注意,该值在编译时是未知的。)

假设这种转变发生在性能关键部分(例如,它是最内层循环中的唯一操作)。我的三难选择正确的操作数(non_consts_expr 的返回类型)应该是最快的移位操作:

  • unsigned int 似乎最易读/最直观)
  • int(AFAIK int 是平台上的本机(也是最快的?)类型,而 unsigned 可以以较低效率的方式实现`)
  • 移位操作中 LHS 的类型(即在本例中为 size_t

这有关系吗?如果是,一般哪一个会产生最快的代码?

【问题讨论】:

  • 如果您担心 unsigned int 类型的性能,您可以随时使用 std::uint_fast32_t,这应该会给您一个快速的。
  • 我认为这并不重要。您是否有任何证据表明这种移位指令是性能瓶颈?
  • 确信由于移位仅定义为 0 到 31(给定 32 位 x)而其他任何东西都是 UB,大多数(黄鼠狼的话)会很简单使用 non_const_expr 的 5 个 LSbits,无论其类型如何。
  • 与 CPU 原生大小匹配的 LHS 整数类型肯定不会比其他任何东西慢。 IE。最快,尽管其他类型可能同样快。
  • @OP,non_const_expr 在“性能关键部分”中的值是否相同?如果是这样,请调用使用固定班次的代码。 if (non_const_expr==5) for(i=n; i&gt;0; i--) { foo1(); x &lt;&lt; 5; foo2(); }。不知何故,在一天结束时,只是看不到优化这种转变会对速度产生任何显着影响。

标签: c++ c bit-shift performance


【解决方案1】:

左移或右移的最佳性能是当 RHS 为正数值常数时。

否则,它取决于处理器。

我建议您编写不同的示例并查看编译器生成的汇编语言代码。您可能还想调整优化设置,看看它们是否有任何影响。

在 ARM7 处理器上,移位操作可能与加载寄存器指令一起发生;否则它将加载一个值,然后使用移位汇编指令。

如果您为 RHS 使用变量,您正在查看最少的操作:

  1. 从内存中加载 RHS。
  2. 将保存 LHS 值的寄存器移动 RHS 值。
  3. 将结果存储到内存中。

真相将在汇编语言列表中。

此级别的优化通常不会产生微不足道的性能提升。通常可以通过优化其他地方的设计或代码来获得更大的收益。

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多