由于您需要在创建时输入数组的长度,因此我假设它需要一个稳固、连续的内存块。List 可以动态扩展,这是否意味着它不需要连续的内存分配?这是否意味着列表不太可能抛出“内存不足”异常?
3 回答
No, it is more likely to run out of memory (assuming that you are comparing creating an array of the correct size with creating a default List and adding the items to it one at a time).
A List
uses an array internally, and when it needs to resize it, it creates a new array twice the size of the original and copies the original into it and then frees the original array.
This means that there are two copies of the data in memory during the resize, meaning more likely to run out of memory.
You can avoid this for a List
if you know the maximum size before creating the list, but in that case you could also use an array.
List<T>
是一个包装器T[]
。这意味着 aList<T>
确实需要一个连续的内存区域和比 a 更多的内存T[]
。有关这方面的更多详细信息,请参阅 Matthew Watson 的回答。
如果您想避免 OutOfMemoryExceptions,那么我建议您在 64 位模式下运行您的程序,而不是尝试将您的数据结构切成小块,因为它更有可能用完连续的可用地址空间而不是用完物理 RAM 和现在交换。为了在 x64 模式下运行您的程序,请将其编译为 anycpu(不喜欢 x86)。
微软的程序员 Raymond Chen 写了一篇关于此的博客文章:http: //blogs.msdn.com/b/oldnewthing/archive/2013/06/28/10429807.aspx ?Redirected=true#comments
在 C#List
中是数组支持的,而不是链表。就像vector
在 C++ 中一样。不需要连续内存块的列表是LinkedList
. 但是,要小心,因为它速度较慢且更容易出错。
查看星际争霸开发者的文章(本身很好读): http: //www.codeofhonor.com/blog/avoiding-game-crashes-related-to-linked-lists