在堆上存储3D VLA

Storing a 3D VLA on heap

本文关键字:3D VLA 存储      更新时间:2023-10-16

我需要在堆上存储一个数组,因为在运行程序时由于它太大而出现了segfault。通常情况下,这很容易,但在这种情况下,它是一个多维数组(特别是3D),它也是一个可变长度数组。

我试着把这个答案适合一个2D数组(我很确定这是有效的,因为我在另一个答案上找到了它)成一个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++解决方案,把这个指针存储在一个有索引方法的类中,像这样:

double& at(x, y, shuffle) {
  return isoarray[x * nBinsY * nShuffles + y * nShuffles + shuffle];
}

这样,您就有了一个单独的连续分配,这在分配、使用和释放时对性能更好。您可以根据通常遍历数据的方式,根据哪个维度"首先"来进行索引,以获得更好的性能。