大型对象数组的极端内存使用[重复]

Posted

技术标签:

【中文标题】大型对象数组的极端内存使用[重复]【英文标题】:Extreme memory usage with large arrays of an Object [duplicate] 【发布时间】:2016-10-02 21:51:03 【问题描述】:

为什么在编译 Sample 1 时,它使用了我所有的 RAM,导致我的计算机崩溃,而 Sample 2 却没有这样做就立即编译?

样本 1:

class Foo

    int a = 0;
;

class Test

    Foo foo[4000000] = ;
;

int main()

    Test t;

示例 2:

class Foo

    int a = 0;
;

int main()

    Foo foo[4000000] = ;

最后,有什么方法可以阻止 Sample 1 在编译时使用大量 RAM?我正在使用gcc version 5.3.0,并使用-std=c++11 编译了上面的内容。请注意,class Test 应该只需要 16 MB 的内存。

对于任何人

【问题讨论】:

it uses all my RAM and crashes my computer 如果 GCC 这样做,那显然是编译器错误。 令人着迷。我猜测 gcc 正试图通过生成代码来初始化 Test 类中的四百万个 Foo 实例中的每一个,从而为该对象创建一个构造函数。不知道为什么 gcc 不能像第二个例子那样做。附: class Test 需要 16mb 内存,400 万 * 4 字节/int。 生成未优化的代码然后优化它并不是非常不合理。不过,显然,在这种情况下,这会产生非常不理想的结果。 【参考方案1】:

这绝对是一个错误。我可以在我的系统上用 5.3 重现这个。 RAM 使用量迅速增加,但我关闭了程序,因为我不希望我的系统崩溃。另一方面,如果我在 Clang 3.8 中编译它,它几乎可以立即编译。

我建议将此报告给 gcc.gnu.org/bugzilla。 indicated here 看看错误报告 59659、68203 和 56671。我很确定它们都指向了 GCC 无法拥有大量非平凡类类型的同一个问题。

【讨论】:

“这绝对是一个错误”。证明? 你也基本上从this问题中复制了答案。请在信用到期时给予信用。

以上是关于大型对象数组的极端内存使用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cython 中将大型 malloc 数组返回或保存为 Python 对象?

js的数组、对象、map、set存储数据

从数组中删除重复的对象

int数组与单个int? [重复]

使用map方法将javascript对象数组转换为其他对象数组[重复]

如何取出数组中相同的对象