【问题标题】:Should I use bit-shift or division?我应该使用位移还是除法?
【发布时间】:2014-11-21 01:01:40
【问题描述】:

维基百科说除以 2 的幂

由于位移通常比除法快得多,因此以这种方式用位移代替除法可能是程序优化的一个有用步骤。[5]但是,为了软件的可移植性和可读性,通常最好使用除法运算编写程序并信任编译器来执行这种替换。

我可以信任编译器吗?哪些编译器(尤其是 C 编译器和 java 编译器)会将 /2^k 替换为 >>k?

【问题讨论】:

  • 编写可读性最强的代码。不要过早地进行优化,尤其是以清晰为代价。

标签: performance compiler-optimization


【解决方案1】:

从编译器的角度来看,对于有符号类型除法和右移是不同的操作,即使您知道该值是非负的,除非它在编译时已知并且编译器能够使用它。

对于无符号类型,我相信所有体面的现代编译器都会将除法改为移位。例如,对于这段代码:

unsigned my_div(unsigned x) {
    return x / 32;
}

unsigned my_shift(unsigned x) {
    return x >> 5;
}

GCCClang 为这两个函数生成相同的汇编输出。

(注意difference 当函数采用int 而不是unsigned

因此,通常您应该使用普通除法,因为它可以保证是正确的。仅在以下情况下才应将其替换为右移:

  1. 它显着提高了程序的性能
  2. 操作数不能为负数(或者您真的知道自己在做什么)

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    相关资源
    最近更新 更多