内存问题的数组与列表

本文关键字:列表 数组 问题 内存 | 更新日期: 2023-09-27 18:30:20

由于您需要在创建时输入数组的长度,因此我假设它需要一个坚实的连续内存块。 列表可以动态扩展,那么这是否意味着它不需要连续的内存分配? 这是否意味着列表引发"内存不足"异常的可能性较小?

内存问题的数组与列表

不,内存不足的可能性更大(假设您将创建正确大小的数组与创建默认列表并一次添加一个项目进行比较)。

List在内部使用数组,当它需要调整其大小时,它会创建一个大小是原始数组大小两倍的新数组,并将原始数组复制到其中,然后释放原始数组。

这意味着在调整大小期间内存中有两个数据副本,这意味着内存不足的可能性更大。

如果您在创建列表之前知道最大大小,则可以在List避免这种情况,但在这种情况下,您也可以使用数组。

List<T>T[]的包装器。这意味着List<T>确实需要一个连续的内存区域和比T[]更多的内存。请参阅Matthew Watson的回答以获取更多详细信息。

如果你想避免OutOfMemoryExceptions,那么与其试图将数据结构切成碎片,我建议以64位模式运行你的程序,因为它更有可能耗尽连续的可用地址空间,而不是用完物理RAM和SWAP。为了在x64模式下运行程序,请将其编译为anycpu(不喜欢x86)。

Microsoft的程序员Raymond Chen写了一篇关于这一点的博客文章:http://blogs.msdn.com/b/oldnewthing/archive/2013/06/28/10429807.aspx?Redirected=true#comments

在 C# 中,List是数组支持的,而不是链表。这就像C++中的vector。不需要连续内存块的列表是 LinkedList 。但是,请注意,因为众所周知,它更慢且更容易出错。

请参阅星际争霸开发人员的文章(本身就很好读): http://www.codeofhonor.com/blog/avoiding-game-crashes-related-to-linked-lists