使用大型数组时LinkedList内存消耗与List相比

时间:2010-05-07 11:28:24

标签: .net memory list linked-list

任何人都可以告诉我是否允许结构的链接列表比同等的List更大(假设列表使用加倍策略来增加其内部数组的大小)。

所以给定一个40字节的结构(我知道16字节和结构的东西,但我在这里使用一些遗留代码,并且将结构改为类不是一个简单的选择)我的理解是每次调整列表的内部数组大小时,需要为新数组分配内存(new_array_size * 40)。因此,对于一个非常大的数组,最终会得到一个outofmemoryexception,因为没有足够大的连续空间来创建这个新数组。我知道一个链表需要更多的空间用于每个元素(节点),因为它需要保持向前和反向指向列表中项目的指针,但我的问题是这是否意味着要添加一个额外的元素,你只需要一个连续的内存插槽(40 + the_space_needed_for_the_pointers)。换句话说,链表不会因为必须分配大量新的连续内存而扩展。

2 个答案:

答案 0 :(得分:3)

是的,这是准确的。 LinkedList不使用数组进行存储,它实际上是一个引用链。当你需要存储大量元素时,你不会在大对象堆中获得垃圾,这与List不同,并且避免地址空间碎片的问题,使你的程序早期出现问题。

请注意,不是是List的替代品,索引是O(n)而不是O(1)。差别很大,除非您总是按顺序迭代列表。当你需要做出像这样的尖锐选择时,现在是开始考虑使用64位操作系统的时候了。

答案 1 :(得分:1)

由于链接列表仅引用了前向和后向引用,因此您不必限制连续的内存分配。 @Hans的答案有很好的分数;但是,我不同意64位操作系统是获得高性能索引的唯一选择。

你只限于这2个选择吗?

如果要引用大量结构,可以考虑使用二叉树吗?使用树的好处是索引是链表的一小部分 - O(log n)。缺点是保持树木平衡的额外工作。平衡势在必行 - 如果没有平衡,你最终会得到相当于一个链表。

从第3部分开始,用二叉树查看此MSDN article(6个部分)。有几种基本的BST。