在堆上存储3D VLA
Storing a 3D VLA on heap
我需要在堆上存储一个数组,因为在运行程序时由于它太大而出现了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];
}
这样,您就有了一个单独的连续分配,这在分配、使用和释放时对性能更好。您可以根据通常遍历数据的方式,根据哪个维度"首先"来进行索引,以获得更好的性能。
相关文章:
- 无法将结构注册为增强几何体3D点
- OpenGL大的3D纹理(>2GB)非常慢
- 是什么导致了Unity 3D中的"错误线程异常"?
- C++中的VLA,扩展名为std=C++11
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 如何从 3D 曲面网格中删除自相交三角形?
- CUDA 使用共享内存平铺 3D 卷积实现
- 检查框内的 3D 点
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 使用 C++在 OpenGL 中对 3D 多边形进行纹理处理
- 使用 C++在 OpenGL 中移动自动旋转的 3D 多边形
- 是否可以使用 DirectX 3D 11 绘制由三角形组成的圆?
- 如何使用条件计算 3D 网格中从一个点到另一个点的所有路径
- 在 OpenGL 中使用键盘移动 3D 形状,C++
- 是否可以制作没有内部分割的cgal 3d多多马因网格?
- 我想通过OpenGL创建3D金字塔
- 在堆上存储3D VLA