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

Can I declare a very large array in a class, C++

本文关键字:非常 数组 C++ 一个 声明 我可以      更新时间:2023-10-16

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

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

通常,堆栈的大小有限。

这可能会导致堆栈溢出:

int main() {
    DumpData x;
}

虽然这些不会:

int main() {
    static DumpData x;
    std::unique_ptr<DumpData> y = std::make_unique<DumpData>();
}

堆栈是一种非常宝贵和稀缺的资源,所以我只会使用来分配大数据。

如果你有一个 3D 坐标数组,而不是使用 vector<vector<double>> ,我只需定义一个类来表示 3D 点,仅使用三个单独的double数据成员,或三个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分配内存,这运行良好,并且它也对DumpData客户端隐藏,为DumpData类提供了一个很好的简单公共接口。