【发布时间】:2023-11-21 09:33:01
【问题描述】:
我需要初始化一个非常大的多维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 成为一个引用(对分配的内存)是最好的方式,但我无法弄清楚语法。 p>
【问题讨论】:
-
如果它被简单地实例化为
World world;,那么您消耗的字节数略多于1000^3 * sizeof(std::unique_ptr<>)。在 64 位系统上,最低 7.629 GB。所以是的,我会说你越过了自动可变空间限制的界限。我渴望知道这是要解决的问题。 -
我刚刚尝试编译这个(将事物更改为 int)并编译。你能举一个小例子来说明编译器失败了吗?
-
@WhozCraig 没有在本地运行,希望我学校里没有人使用这台机器做任何事情。刚刚得到这个 g++: internal compiler error: Killed (program cc1plus) 请提交一个完整的错误报告,如果合适的话,带有预处理的源代码。有关说明,请参阅 bugzilla.redhat.com/bugzilla>。使用了计算机上所有 24GB 的内存
-
@thirtythreeforty 除了我怀疑它构建嵌入了所有这些 DD 的对象模块之外,我无法解释为什么这会对 g++ 产生影响。我确实发布了一个替代方案,可能在此期间为您工作。希望对您有所帮助。
-
这看起来像GCC Bug #59659:编译器通过直接初始化每个元素为大型
std::array生成巨大的初始化代码。