我有以下代码来分配二维数组

#include <iostream>
using namespace std;
int **malloc2d(int r,int c){
    int **t=new int*[r];
     for (int i=0;i<r;i++)
         t[i]=new int[c];

      for (int i=0;i<r;i++){
           for (int j=0;j<c;j++){
                t[i][j]=i+j;
           }
      }
     return t;
     }

int main(){
    int m=10;
    int n=10;
    int **a=malloc2d(m,n);
     for (int i=0;i<m;i++){
          for (int j=0;j<n;j++){

              cout<<a[i][j]<< " ";
              cout<< " \n";
          }
          cout<< " \n";
     }


    return 0;


}

它有效,但是我的问题是:根据性能效率或根据代码速度,此代码的性能如何?谢谢

最佳答案

使用int **时,您有很多指向微小(4字节)内存空间的指针,由于malloc开销(每个malloc实现都有开销),效率很低(通常,最小值通常是sizeof(void*) AFAIK,这对您而言意味着至少有100%的开销)对于所有“单元格”)。

或者,您可以使用一维数组并自己计算索引,如下所示:index = (row * num_columns) + column。但是,您将失去漂亮的a[row][column]表示法。尽管如此,访问它也应该更快,因为在(干净的)解决方案中必须有两个指针取消引用(内存操作),而我建议您只有一个。它看起来像这样:

#include <iostream>

using namespace std;

inline int a_index(int row, int column, int column_size) {
        return((row * column_size) + column);
}

int *malloc2d(int r,int c) {
        int *t=new int[r * c];
        for (int i=0;i<r;i++){
                for (int j=0;j<c;j++){
                        t[a_index(i,j,c)]=i+j;
                }
        }
        return t;
}


int main(){
        int m=10;
        int n=10;
        int *a=malloc2d(m, n);
        for (int i=0;i<m;i++){
                for (int j=0;j<n;j++){
                        cout<<a[a_index(i,j,n)]<< " ";
                        cout<< " \n";
                }
                cout<< " \n";
        }

        return 0;
}

关于c++ - 二维数组分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3593944/

10-11 04:22