以
中的线性方式寻址多维数组中的寻址值values[row_num*row_width + column_num]
与值[row] [col]相比,为乘法/加法产生额外的计算?或者编译器是否将后者转换为前者?
答案 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)
编译器是否转换后者 无论如何对前者?
是。如果您索引连续的内存位置,缓存将对您有利,非常重要。