【问题标题】:Storing a 3D VLA on heap在堆上存储 3D VLA
【发布时间】:2015-09-24 04:52:13
【问题描述】:

我需要在堆上存储一个数组,因为我在运行程序时遇到了段错误,因为它太大了。通常这很容易,但在这种情况下,它是一个多维数组(特别是 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,但它不起作用,老实说我也不认为它会起作用。任何人都可以就我将如何做到这一点提出建议吗?提前致谢!

【问题讨论】:

  • 你不需要三指针吗?一维数组的一级指针;二维数组的两级指针;还有……让我们想想……哦,3D 数组可能有三个层次?

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


【解决方案1】:

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

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

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

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

这样您就有了一个连续的分配,在分配、使用和解除分配时性能更好。根据您通常遍历数据的方式,您可以根据哪个维度“首先”来使用索引以获得更好的性能。

【讨论】:

  • 我明白了,感谢您的意见。执行您之前提到的堆分配数组过程有什么缺点?
  • 多次分配的主要缺点就在我的回答中:它很慢。
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 2013-03-07
  • 2019-05-03
  • 2019-04-01
相关资源
最近更新 更多