我需要初始化一个非常大的多维std::array
数据:
class Thing;
class World
{
public:
World() : space{nullptr} {};
~World() = default;
private:
static unsigned int const size = 1000;
std::array<std::array<std::array<std::unique_ptr<Thing>, size>, size>, size> space;
};
如果你试图实例化它,G ++ 4.8.2会扼杀它:它消耗所有可用的内存并且不会返回。也就是说,编译器挂起,我永远不会得到可执行文件。 为什么会这样?请注意,clang ++没有问题。
注意:我完全意识到将这么多数据放在堆栈上会溢出它。 在堆上初始化它的最佳方法是什么?我认为将space
作为引用(分配内存)是最好的方法,但我无法弄清楚语法进行。
答案 0 :(得分:3)
当您使用unique_ptr
时,您似乎正在寻找类似稀疏的3d矩阵。要实现稀疏矩阵,您可以查看What is the best way to create a sparse array in C++?,作为实施细节,您可以使用Boost Multi-index来实现对所有维度的快速访问。
答案 1 :(得分:2)
好的,我无法解释g ++为什么会这样做的细微差别,但在你解决这个问题之前,请考虑一下你的会员声明:
std::vector<std::array<std::array<std::unique_ptr<Thing>,size>,size>> space;
并在构造函数初始化列表中:
World() : space{size}
这应该至少让你编译并将所有这些移动到堆中。注意:这最好是64位进程。我将不得不去寻找为什么g ++正在做我怀疑它正在做的事情。
答案 2 :(得分:0)
vector<vector<vector<unique_ptr<Thing>>>> space;
并在初始化时:
for (int i = 0; i < 1000; i++)
{
vector<vector<unique_ptr<Thing>>> sp1;
for (int j = 0; j < 1000; j++)
{
vector<unique_ptr<Thing>> sp2;
for (int k = 0; k < 1000; k++)
sp2.push_back(make_unique<Thing>("params", "to", "construct", "thing"));
sp1.push_back(move(sp2));
}
space.push_back(move(sp1));
}
它与您的方法类似,但它构造堆中的向量而不是堆栈。