我可以在类C ++中声明一个非常大的数组

时间:2014-11-13 22:25:58

标签: c++ arrays class bigdata

我正在尝试编写一个类来存储数百万个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数组更改为vector
vector < vector <double> > m_atomCoords;

然后程序工作了。 我只是想知道在类中声明非常大的数组有限制吗?

2 个答案:

答案 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类创建一个简单的公共接口。