在堆上存储 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" 以获得更好的性能,具体取决于您通常遍历数据的方式。