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

Pra*_*hal 11 c++ arrays performance pointers pointer-arithmetic

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

处理数组时,关键查找操作通常涉及一个称为地址计算的阶段,该阶段涉及构造指向数组中所需数据元素的指针.如果数组中的数据元素具有可被2的幂整除的长度,则此算法通常更有效.

为什么会这样?

以上行写在"使用"标题下

Mat*_*son 12

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

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

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

  • 自Core 2以来,在Intel处理器上的整数乘法一直是3个周期的延迟,吞吐量为1 /周期.Shift是1个周期的延迟和2个/周期.所以是的,转变仍然更快.但不是很多. (3认同)