我有以下代码来分配二维数组
#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/