我可以在类中声明一个非常大的数组吗,C++
Can I declare a very large array in a class, C++
我正在尝试编写一个类来存储数百万个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
类提供了一个很好的简单公共接口。
相关文章:
- 当 95% 情况下的值为 0 或 1 时,对非常大的数组进行随机访问的任何优化
- 将一个数组的每个元素乘以另一个数组的每个元素,并对新的非常大的数组进行排序
- 在64位系统上创建一个非常大的数组的缺点是什么
- 在不进行线性搜索的情况下,在非常大的数组中找到比给定数字更小的数字
- 在堆上声明和初始化非常大的数组
- 保存值非常小的字节数组
- CIN 一个非常大的 int 数组,段故障 11
- 如何创建非常大的唯一整数数组
- 非常简单的多维数组程序打开Visual Studio JIT
- 犯了一个非常愚蠢的 C/C++ 数组/数组指针错误
- 我可以在类中声明一个非常大的数组吗,C++
- C++中非常大的数组存在内存问题
- 定义一个非常大的数组(查找表)的最佳方式是什么
- 从两个非常大的数组中查找公共元素
- c++循环中的SIGSEGV和一个非常大的数组
- 从uint8_t数组修改数据非常慢
- 如何快速初始化一个非常大的数组
- 一个非常大的数组(连续内存块)
- 在C/ c++中对非常大的静态数组进行算术运算
- 在一个非常小的数组中找到最小值