Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在线性内存空间中寻址2d数组的开销_C++_Performance_Memory - Fatal编程技术网

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];
也就是说,这样的代码产生一个额外的内存访问。由于在当前的体系结构中,内存访问比计算偏移量要贵几个数量级,因此这种类型的多维数组比使用线性内存块和计算(或让编译器在可能的情况下计算)偏移量的效率要低