【发布时间】:2014-04-01 17:23:09
【问题描述】:
我想将无符号类型(例如 size_t)向左/右移动非负数(二进制)数字/位置,例如
size_t x;
x << non_const_expr
假设non_const_expr 的值适合(unsigned) int 和never 会导致未定义的行为(其值为非负数且不超过x 中的位数)。 (请注意,该值在编译时是未知的。)
假设这种转变发生在性能关键部分(例如,它是最内层循环中的唯一操作)。我的三难选择正确的操作数(non_consts_expr 的返回类型)应该是最快的移位操作:
-
unsigned int似乎最易读/最直观) -
int(AFAIKint是平台上的本机(也是最快的?)类型,而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>0; i--) { foo1(); x << 5; foo2(); }。不知何故,在一天结束时,只是看不到优化这种转变会对速度产生任何显着影响。
标签: c++ c bit-shift performance