我正在尝试编写一个类来存储数百万个3D坐标数据。首先,我尝试使用3D数组来存储这些坐标数据。
#ifndef DUMPDATA_H
#define DUMPDATA_H
#define ATOMNUMBER 2121160
#include <string>
using namespace std;
class DumpData
{
public:
DumpData(string filename);
double m_atomCoords[ATOMNUMBER][3];
};
#endif // DUMPDATA_H
然后我编译了程序,但是当我在ubuntu 14.04系统(64位)中运行程序时,我得到了段错误。所以我通过声明:
将3D数组更改为vectorvector < vector <double> > m_atomCoords;
然后程序工作了。 我只是想知道在类中声明非常大的数组有限制吗?
答案 0 :(得分:6)
通常,堆栈的大小有限。
这可能会导致堆栈溢出:
int main() {
DumpData x;
}
虽然这些赢了:
int main() {
static DumpData x;
std::unique_ptr<DumpData> y = std::make_unique<DumpData>();
}
答案 1 :(得分:2)
堆栈是一种非常宝贵且稀缺的资源,所以我只是使用堆来分配大数据。
如果您有一个3D坐标数组,而不是使用vector<vector<double>>
,我只需使用三个单独的double
数据成员定义一个表示3D点的类,或者一个由三个double
组成的原始数组,例如:
class Point3D {
private:
double m_vec[3]; // X, Y and Z
// or:
// double x;
// double y;
// double z;
public:
double X() const {
return m_vec[0];
// or:
// return x;
}
... other setters/getters, etc.
};
然后我只使用 std::vector<Point3D>
作为DumpData
课程中的数据成员。
(如上定义的Point3D
类比std::vector<double>
具有更少的开销,并且还提供更高级别的语义,因此它是更好的选择。)
使用默认分配器,std::vector
将从堆(而非堆栈)为大量Point3D
s分配内存,这样可以正常工作,并且它也隐藏在DumpData
的客户端之外,为DumpData
类创建一个简单的公共接口。