我正在深入研究指针,因为我不认为我对指针有很好的了解,并在维基百科上发现了以下几行:
处理数组时,通常采用关键查找操作 涉及一个称为地址计算的阶段,涉及到 构造指向数组中所需数据元素的指针。如果 数组中的数据元素具有可被整除的长度 这两个算法的效率通常要高得多。
为什么会这样?
答案 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的幂时,你可以使用移位操作,这些操作比某些系统上的完全成倍增加操作要贵。