一维数组对二维阵列的大小影响



以下声明大数组的方法之间是否存在性能或大小差异 -

int a[4000][4000]int a[4000 * 4000]?如果可能的话,我们应该更喜欢一个而不是另一个吗?

内存布局没有区别。

访问速度应该没有区别,但您需要测量才能确定。

一维阵列用途更广。如果你想做一个可以接受不同大小数组的函数,用一维数组你可以简单地做void foo(int *arr, std::size_t w, std::size_t h)。但是对于2D阵列,没有好的解决方案。即使它们的内存布局相同,尝试将 2D 数组传递给此类函数也会导致 UB,只是因为标准是这样说的。

如果您稍后决定要在堆上分配数组,则使用 1D 数组进行转换会更容易,因为您可以保留相同的[]语法。对于 2D 数组,您要么必须使用指向数组的指针数组(效率较低),要么编写一个包装 1D 数组并重载operator[]的类(这是正确的方法,但需要时间)。

编译器生成的代码使用指针算法访问任何数组,如下所示:

A[i] == *(&A+i)

在二维数组的情况下A[d1][d2]

A[i][j] == *(&A+(i*d2)+j)

对于多维数组,它变得越来越复杂,但在内部它始终是一个线性内存块,从存储在数组变量中的内存位置开始。

如果你的代码没有行列逻辑,那么最好使用线性数组,但如果你需要这种代码,那么最好根据需要使用多维数组,因为指针算术可以非常有效地优化编译器。

最新更新