在堆上存储3D VLA

时间:2015-09-24 04:52:13

标签: c++ heap-memory variable-length-array

我需要在堆上存储一个数组,因为它在运行程序时遇到了一个seg错误,因为它太大了。通常这很容易,但在这种情况下它是一个多维数组(具体是3D),它也是一个可变长度的数组。

我试图将这个答案放在一个二维阵列上(我非常肯定有效,因为我在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,但它不起作用,我也不认为它是诚实的。任何人都可以提出如何做到这一点的建议吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

不是堆指向更多堆分配的数组的指针数组等,而是应该进行单个巨型分配并进行适当的索引。这是一种常见的技术:

double *isoarray = new double[nBinsX * nBinsY * nShuffles];

如果你想用它制作一个不错的C ++解决方案,那么将该指针存储在一个具有索引方法的类中:

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

这样,您可以使用单个连续分配,这在分配,使用和解除分配时更有效。你可以根据哪个维度和#34;第一个&#34;来玩索引。根据您通常遍历数据的方式来获得更好的性能。