为什么总是避免使用C/C++中的多维数组进行数值计算?

sas*_*ash 0 c c++ arrays multidimensional-array

在数值计算中,我们经常处理矩阵和张量,但是当我们用C/C++编写代码时,为什么我们总是使用一维数组来表示矩阵和张量?为什么我们不能使用多维数组呢?显然,多维数组更方便,就像在Matlab中一样.多维数组是否会花费太多内存?谢谢你的任何解释.

PS:我正在读一本数值计算代码.三指数张量T(i,j,k)总是由一维阵列T [1]表示,其中l = i + jI + kIJ(IJK分别是指数ijk的维度).我想知道我是否可以在三维数组T [i] [j] [k]中写出张量?

R S*_*ahu 5

当使用malloc或从免费存储分配数组的内存时,operator new使用1D数组的成本较低.

对于M x N2D阵列,如果使用1D阵列,则需要使用:

T* array = new T[M * N];
Run Code Online (Sandbox Code Playgroud)

如果要在语法形式中使用看起来像2D数组的内容,则需要使用:

T** array = new T*[M];
for ( size_t i = 0; i < M; ++i )
{
   array[i] = new T[N];
}
Run Code Online (Sandbox Code Playgroud)

那不是2D数组而是锯齿状数组.

当然,您需要调用来释放反映分配方法的内存.

使用时T**,不仅需要为M指针分配空间,还需要使用1 + N动态内存分配调用,而不是只调用一次动态内存分配.

根据分配和释放内存的调用频率,额外的开销可能很大.

另一个重要问题是,当分配1D阵列的动态内存时,您可以访问一大块连续内存.如上所述分配2D阵列的动态内存时,您不会获得连续的内存.连续内存更适合缓存,可能会影响性能.