【发布时间】:2011-02-20 00:16:50
【问题描述】:
我有一些需要二维数组的东西,但为了获得更好的缓存性能,我宁愿它实际上是一个普通数组。这是我的想法,但我不知道这是不是一个糟糕的想法:
const int XWIDTH = 10, YWIDTH = 10;
int main(){
int * tempInts = new int[XWIDTH * YWIDTH];
int ** ints = new int*[XWIDTH];
for(int i=0; i<XWIDTH; i++){
ints[i] = &tempInts[i*YWIDTH];
}
// do things with ints
delete[] ints[0];
delete[] ints;
return 0;
}
所以我的想法是,我不是new一堆数组(并将它们放在内存中的不同位置),而是指向一个我一次创建的数组。
delete[] (int*) ints; 的原因是因为我实际上是在一个类中执行此操作,它会节省 [微不足道的] 内存而不是保存原始指针。
只是想知道是否有任何理由这是一个可怕的想法。或者,如果有更简单/更好的方法。目标是能够以ints[x][y] 而不是ints[x*YWIDTH+y] 访问数组。
编辑:一个简单的基准测试表明,我的方式在没有优化器的情况下更快,但 gcc 可能出于某种原因在简单方式上优化得更好。
如果你用gcc -O0编译,最好是stack,然后是mine,然后normal。如果你编译时 X_MAX 设置为大值,Y_MAX 设置为小值,并使用 gcc -O3,我的和堆栈应该真的很快,但正常的不会。如果你让 X_MAX 小而 Y_MAX 大,正常的方法应该会赢(甚至由于某种原因超过了堆栈方法)。
【问题讨论】:
标签: c++ multidimensional-array memory-management