由于您需要在创建时输入数组的长度,我认为它需要一个可靠,连续的内存块。 List可以动态扩展,这是否意味着它不需要连续的内存分配?这是否意味着List不太可能抛出“Out of Memory”异常?
答案 0 :(得分:7)
不,它更有可能耗尽内存(假设您正在比较创建正确大小的数组与创建默认列表并一次向其添加一个项目。)
List
在内部使用数组,当需要调整它的大小时,它会创建一个两倍于原始数据的新数组,并将原始数据复制到其中,然后释放原始数组。
这意味着在调整大小期间内存中有两个数据副本,这意味着更有可能耗尽内存。
如果您在创建列表之前知道最大大小,则可以对List
避免这种情况,但在这种情况下您也可以使用数组。
答案 1 :(得分:1)
List<T>
是T[]
的包装器。这意味着List<T>
确实需要一个连续的内存区域和比T[]
更多的内存。有关详细信息,请参阅Matthew Watson的答案。
如果你想避免使用OutOfMemoryExceptions,那么我建议以64位模式运行你的程序,而不是试图将数据结构切成碎片,因为它更有可能耗尽连续的免费ADDRESS SPACE而不是耗尽现在物理RAM和SWAP。为了在x64模式下运行程序,请将其编译为anycpu(不喜欢x86)。
微软程序员Raymond Chen撰写了一篇关于此事的博客文章: http://blogs.msdn.com/b/oldnewthing/archive/2013/06/28/10429807.aspx?Redirected=true#comments
答案 2 :(得分:0)
在C#List
中是数组支持的,而不是链表。它就像C ++中的vector
。不需要连续内存块的列表是LinkedList
。但是,要小心,因为它已知slower并且更容易出错。
查看星际争霸开发者的文章(本身就是一个很好的阅读):http://www.codeofhonor.com/blog/avoiding-game-crashes-related-to-linked-lists