大型对象数组的极端内存使用[重复]
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 对象?