在堆上存储 3D VLA
Storing a 3D VLA on heap
我需要在堆上存储一个数组,因为我在 运行 程序时遇到段错误,因为它太大了。通常这很容易,但在这种情况下它是一个多维数组(特别是 3D)并且它也是一个可变长度数组。
我试图将这个 2D 数组的答案(我很确定它可以工作,因为我在 SO 的另一个答案上找到了它)适合 3D 数组
int **ary = new int*[sizeY];
for(int i = 0; i < sizeY; ++i) {
ary[i] = new int[sizeX];
}
通过这样做:
double **isoarray = new double*[nBinsX];
for(int xi = 0; xi < nBinsX; ++xi){
isoarray[xi] = new double[nBinsY];
for(int yi = 0; yi < nBinsY; ++yi){
isoarray[xi][yi] = new double[nShuffles];
}
}
我应该提到数组的尺寸是 nBinsX x nBinsY x nShuffles,但它不起作用,老实说我也不认为它会如此。任何人都可以就我将如何做到这一点提出建议吗?提前致谢!
而不是堆分配指向更多堆分配数组等的指针数组,您应该进行一次巨大的分配并进行适当的索引。这是一个常用的技术:
double *isoarray = new double[nBinsX * nBinsY * nShuffles];
如果你想用它制作一个很好的 C++ 解决方案,请将该指针存储在一个 class 中,它有一个类似这样的索引方法:
double& at(x, y, shuffle) {
return isoarray[x * nBinsY * nShuffles + y * nShuffles + shuffle];
}
这样你就有了一个连续的分配,这在分配、使用和解除分配时都有更好的性能。您可以根据哪个维度来使用索引 "first" 以获得更好的性能,具体取决于您通常遍历数据的方式。
我需要在堆上存储一个数组,因为我在 运行 程序时遇到段错误,因为它太大了。通常这很容易,但在这种情况下它是一个多维数组(特别是 3D)并且它也是一个可变长度数组。
我试图将这个 2D 数组的答案(我很确定它可以工作,因为我在 SO 的另一个答案上找到了它)适合 3D 数组
int **ary = new int*[sizeY];
for(int i = 0; i < sizeY; ++i) {
ary[i] = new int[sizeX];
}
通过这样做:
double **isoarray = new double*[nBinsX];
for(int xi = 0; xi < nBinsX; ++xi){
isoarray[xi] = new double[nBinsY];
for(int yi = 0; yi < nBinsY; ++yi){
isoarray[xi][yi] = new double[nShuffles];
}
}
我应该提到数组的尺寸是 nBinsX x nBinsY x nShuffles,但它不起作用,老实说我也不认为它会如此。任何人都可以就我将如何做到这一点提出建议吗?提前致谢!
而不是堆分配指向更多堆分配数组等的指针数组,您应该进行一次巨大的分配并进行适当的索引。这是一个常用的技术:
double *isoarray = new double[nBinsX * nBinsY * nShuffles];
如果你想用它制作一个很好的 C++ 解决方案,请将该指针存储在一个 class 中,它有一个类似这样的索引方法:
double& at(x, y, shuffle) {
return isoarray[x * nBinsY * nShuffles + y * nShuffles + shuffle];
}
这样你就有了一个连续的分配,这在分配、使用和解除分配时都有更好的性能。您可以根据哪个维度来使用索引 "first" 以获得更好的性能,具体取决于您通常遍历数据的方式。