【发布时间】:2010-08-31 21:21:03
【问题描述】:
是否像在
中那样以线性方式寻址多维数组中的寻址值values[row_num*row_width + column_num]
与 values[row][col] 相比,是否需要额外计算乘法/加法?还是编译器将后者转换为前者?
【问题讨论】:
标签: c++ performance memory
是否像在
中那样以线性方式寻址多维数组中的寻址值values[row_num*row_width + column_num]
与 values[row][col] 相比,是否需要额外计算乘法/加法?还是编译器将后者转换为前者?
【问题讨论】:
标签: c++ performance memory
假设您正在比较索引,例如int values[M*N] 和 int values[M][N],那么它们将在实践中创建等效的代码。
但是,如果您使用 values[row][col] 来索引,例如int (*values)[N],那就另当别论了……
【讨论】:
这取决于。如果你这样声明一个数组:
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)
即这样的代码会产生一个额外的内存访问。而且由于在当前架构上,内存访问比计算偏移量要贵几个数量级,因此这种多维数组样式的效率低于使用线性内存块和计算(或让编译器在可能的情况下计算)偏移量。
【讨论】:
编译器是否转换后者 还是前者?
是的。如果您索引连续的内存位置,缓存将对您大有裨益。
【讨论】: