初始化大型std :: arrays时编译器挂起

时间:2014-03-25 03:32:54

标签: c++ arrays c++11

我需要初始化一个非常大的多维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作为引用(分配内存)是最好的方法,但我无法弄清楚语法进行。

3 个答案:

答案 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));
}

它与您的方法类似,但它构造堆中的向量而不是堆栈。