为什么数组元素长度的地址计算可被2的幂整除?

时间:2014-01-01 10:40:02

标签: c++ arrays performance pointers pointer-arithmetic

我正在深入研究指针,因为我不认为我对指针有很好的了解,并在维基百科上发现了以下几行:

  

处理数组时,通常采用关键查找操作   涉及一个称为地址计算的阶段,涉及到   构造指向数组中所需数据元素的指针。如果   数组中的数据元素具有可被整除的长度   这两个算法的效率通常要高得多。

为什么会这样?

The above line is written under the heading "Uses"

4 个答案:

答案 0 :(得分:12)

乘以2 n 通过左移来完成。现代处理器可以在一个周期内进行移位(在x86中,对于小的移位,最多8或16,内置于地址计算本身)。在AMD64机器上进行常规乘法运算需要4-10个时钟周期,而在现代英特尔处理器上则很可能类似。如何“闭合”两个连续的乘法运算也有限制。

当然,如果数组的大小非常大,使用乘法指令并更紧密地打包数据(不使用填充将数据扩展到2大小的幂)可能更有效,因为缓存效率

当然,现代编译器很聪明,所以如果需要乘以X乘以12,编译器将生成(X << 3) + (X << 2),例如,这比单个乘法运算更快。

答案 1 :(得分:3)

第i个元素的地址计算涉及base + size_of_element * i

当元素的大小是2的幂时,比如size_of_element = 2 ^ m,那么可以用base + (i << m)来实现。

与早期计算中涉及的乘法相比,变换效率更高。

答案 2 :(得分:2)

因为可以使用左移而不是乘法来计算偏移量,但我还要说,鉴于CPU中的流水线量,该备注可能已经过了十年或两年。

答案 3 :(得分:2)

当在数组中找到第N个成员时必须进行相乘时,当你处理2的幂时,你可以使用移位操作,这些操作比某些系统上的完全成倍增加操作要贵。