代码之家  ›  专栏  ›  技术社区  ›  Andrew

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

  •  4
  • Andrew  · 技术社区  · 14 年前

    有谁能告诉我是否允许结构的LinkedList增长到大于等效列表(假设列表使用加倍策略来增加其内部数组的大小)。

    因此,给定一个40字节的结构(我知道16字节和结构,但我正在处理一些遗留代码,将结构更改为类不是一个容易的选择)我的理解是,每次调整列表的内部数组的大小时,内存都需要分配给新阵列的Ted(新阵列大小*40)。所以对于一个非常大的数组,您最终会得到一个OutOfMemoryException,因为没有足够大的连续空间来创建这个新数组。我知道LinkedList需要为每个元素(节点)提供更多的空间,因为它需要向前和向后指针指向列表中的项,但我的问题是,这是否意味着要添加额外的元素,您只需要一个连续的内存槽(40+指针所需的空间)。换言之,linkedlist不必为扩展而分配一大块新的连续内存。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Hans Passant    14 年前

    是的,那是准确的。LinkedList不使用数组进行存储,它实际上是一个引用链。与list不同,当需要存储大量元素时,在大型对象堆中不会得到垃圾,并避免地址空间碎片导致程序过早崩溃的问题。

    当心它是 作为列表的替代,索引是o(n)而不是o(1)。区别很大,除非您总是按顺序迭代列表。当你需要做出这样尖锐的选择时,是时候开始考虑64位操作系统了。

        2
  •  1
  •   IAbstract    14 年前

    由于链接列表只引用正向和反向引用,因此不绑定到连续内存分配。@汉斯的回答有很好的优点;但是,我不同意64位操作系统是唯一具有高性能索引的选项。

    你只限于这两种选择吗?

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

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