在线性存储空间中寻址2d数组的开销

时间:2010-08-31 21:21:04

标签: c++ performance memory

中的线性方式寻址多维数组中的寻址值
values[row_num*row_width + column_num]
与值[row] [col]相比,

为乘法/加法产生额外的计算?或者编译器是否将后者转换为前者?

3 个答案:

答案 0 :(得分:1)

假设您正在将索引与例如分别为int values[M*N]int values[M][N],这些将在实践中创建相同的代码。

但是,如果您使用values[row][col]进行索引,例如int (*values)[N],那是另一回事......

答案 1 :(得分:1)

这取决于。如果你声明一个这样的数组:

int values[m][n];

然后编译器优化访问,即使用线性内存并计算正确的偏移量(如伪代码中)。

但是如果你声明一个这样的数组:

int **values;
values = new int*[m];
for (size_t i = 0; i < m; ++i) values[i] = new int[n];

然后编译器无法优化像

这样的数组访问
values[row][col]
// same as
*(*(values+row) + col)

即。这样的代码产生一个额外的内存访问而且由于在当前的体系结构中,内存访问比计算偏移量要贵几个数量级,这种更多维数组的样式效率低于使用线性内存块和计算(或让编译器尽可能计算)偏移。

答案 2 :(得分:0)

  

编译器是否转换后者   无论如何对前者?

是。如果您索引连续的内存位置,缓存将对您有利,非常重要。