【问题标题】:Can I declare a very large array in a class, C++我可以在一个类中声明一个非常大的数组吗,C++
【发布时间】:2015-01-11 05:35:21
【问题描述】:

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

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

【问题讨论】:

  • 48mb 不算多,除非您声明一个非静态局部变量,否则您可能会用完堆栈空间。
  • @CaptainObvlious 8mb? 2121160*8*3/1024/1024给我48
  • @BryanChen 只是在打字时错过了 4。哎呀。
  • 对于这个问题,提及您的操作系统会很好,因为 Windows 和 Linux 使用堆栈不同
  • @frans 这是 Ubuntu 14.04(64 位)

标签: c++ arrays class bigdata


【解决方案1】:

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

如果你有一个 3D 坐标数组,而不是使用 vector&lt;vector&lt;double&gt;&gt;,我只需定义一个类来表示一个 3D 点,只使用三个单独的 double 数据成员或 raw 三个doubles 的数组,例如:

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&lt;Point3D&gt; 作为 DumpData 类中的数据成员。

(如上定义的Point3D 类的开销比std::vector&lt;double&gt; 少,并且还提供更高级别的语义,因此是更好的选择。)

使用默认分配器,std::vector 会为大量的Point3Ds 从(而不是从堆栈)分配内存,效果很好,而且它也是隐藏的来自DumpData 的客户端,为DumpData 类制作了一个漂亮的简单公共接口。

【讨论】:

    【解决方案2】:

    一般来说,堆栈的大小是有限的。

    这可能会导致堆栈溢出:

    int main() {
        DumpData x;
    }
    

    虽然这些不会:

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

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 2017-10-09
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 2020-02-15
      相关资源
      最近更新 更多