【问题标题】:What are the internal differences of a T[] and a List<T> in terms of memory?T[] 和 List<T> 在内存方面的内部差异是什么?
【发布时间】:2013-12-22 11:42:58
【问题描述】:

我正在阅读一篇关于 array vs list 的文章,作者说数组比列表更糟糕,因为(除其他外)数组是变量的列表,但对我来说列表也是变量列表。我的意思是,我仍然可以做到list[3] = new Item()

实际上,我总是以某种方式看到 List&lt;T&gt; 就像一个数组的包装器,它允许我轻松使用它而无需关心处理它的结构。

T[]List&lt;T&gt; 在堆/堆栈内存使用方面的内部差异是什么?

【问题讨论】:

  • 从技术上讲,List&lt;T&gt; 是数组的包装器。它在内部保存对数组的引用,因此 List 会消耗更多内存(假设内部数组已完全填充)。但这种差异非常小(List 消费者大约有 20 到 30 字节的额外内存),所以不要过早优化。
  • 那么作者是不是错了,在这件事上没有区别?
  • 他在博文中明确指出,“有人可能会合理地指出List&lt;T&gt; 也是大量可变状态”。当然如此。堆使用量不是您可以完全忽略的细节,在常用的情况下,平均开销是 lots 超过 30 个字节。在this answer 中有很好的报道。

标签: arrays .net list heap-memory


【解决方案1】:

由于数组是静态结构,在初始化之后,它会分配你需要的内存。

int arr[5];

例如这里有 5 个int 对象在内存中创建。但是当你使用列表时,根据它的实现,它首先给你一个具有预定义容量的数组。当你添加元素时,如果你超过了容量,那么它就会扩大。在某些实现中,它只是将其大小加倍,或者在某些实现中,当授予的容量为一半时,它会自行扩大。

【讨论】:

    【解决方案2】:

    作者关于“变量列表”的观点与内存无关。这是一个数组包含您的内部变量,并返回它允许调用者重新分配它们。归根结底:

    仅当数组被只读对象包裹时才传递它。

    如果你传递了一个内部List&lt;T&gt;,你也会遇到同样的问题,但关键是:

    我们有一个列表的可扩展模型,因为列表是类。我们 没有能力制作“不可变数组”。数组就是它们的样子 他们永远不会改变。

    而且,在撰写本文时,IReadOnlyList 接口还不存在(.NET 4.5),尽管如果有的话他可能会提到它。我相信他提倡实现IList&lt;T&gt;,如果您尝试使用setter,它只会抛出异常。当然,如果用户不需要通过索引访问元素的能力,那么您根本不需要列表接口——您可以将其包装在 ReadOnlyCollection&lt;T&gt; 中并以 IEnumerable&lt;T&gt; 的形式返回。

    【讨论】:

    • 对不起,我要问的是列表和数组之间的内部差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多