C++ 在线性内存空间中寻址2d数组的开销
在多维数组中以线性方式寻址值,如C++ 在线性内存空间中寻址2d数组的开销,c++,performance,memory,C++,Performance,Memory,在多维数组中以线性方式寻址值,如 values[row_num*row_width + column_num] 与[行][列]值相比,乘法/加法会产生额外的计算吗?或者编译器是否将后者转换为前者 编译器是否转换后者 还是前者 对。如果您对连续的内存位置进行索引,缓存将非常有利于您。假设您将索引分别比较为int-values[M*N]和int-values[M][N],那么这些将在实践中创建等效的代码 但是,如果您使用值[row][col]索引到例如int(*values)[N],则这是另一回事
values[row_num*row_width + column_num]
与[行][列]值相比,乘法/加法会产生额外的计算吗?或者编译器是否将后者转换为前者
编译器是否转换后者
还是前者
对。如果您对连续的内存位置进行索引,缓存将非常有利于您。假设您将索引分别比较为
int-values[M*N]
和int-values[M][N]
,那么这些将在实践中创建等效的代码
但是,如果您使用
值[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];
然后编译器优化访问,即使用一段线性内存并计算正确的偏移量(如伪代码)
但是如果您声明这样的数组:
int values[m][n];
int **values;
values = new int*[m];
for (size_t i = 0; i < m; ++i) values[i] = new int[n];
也就是说,这样的代码产生一个额外的内存访问。由于在当前的体系结构中,内存访问比计算偏移量要贵几个数量级,因此这种类型的多维数组比使用线性内存块和计算(或让编译器在可能的情况下计算)偏移量的效率要低