c++ - 为什么数组元素长度的地址计算可以被 2 的幂整除更有效?

标签 c++ arrays performance pointers pointer-arithmetic

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

When dealing with arrays, the critical lookup operation typically involves a stage called address calculation which involves constructing a pointer to the desired data element in the array. If the data elements in the array have lengths that are divisible by powers of two, this arithmetic is usually much more efficient.

为什么会这样?

The above line is written under the heading "Uses"

最佳答案

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

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

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

关于c++ - 为什么数组元素长度的地址计算可以被 2 的幂整除更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20867746/

相关文章:

c++ - 错误 : taking address of temporary [-fpermissive] - npc_multivendor

c++ - 为什么 GCC 说 "named return values no longer supported"?

c++ - 无法在 C++ 中显示二维数组中的字符串

python - Numpy 根据另一个数组的值分配一个数组值,并根据向量选择列

C++ 初始值设定项列表 std::array 最佳性能

c++ - 使用指针符号循环遍历数组

java - 尝试使用第三个矩阵同时初始化两个矩阵 Row 和 Col

sql-server - SQL Server 缓冲区缓存内容

javascript - 改进 Javascript 中的数组转换

Java8 流奇怪的行为