【发布时间】:2016-09-10 15:12:08
【问题描述】:
我在ReferenceSource 中查看List<T> 并发现List<T>.Add(还有Remove 和RemoveAt)实际上将内部列表数组(T[] _items)复制到一个带有新修改的新数组中;他们实际上调用了Array.Copy 方法,即调用CLR-internal 方法Copy。我不知道该内部方法 (Copy) 是如何工作的,但如果它按照所谓的方式工作(复制),那么我相信这将是一种在列表;我想知道为什么没有实际的添加和删除?
【问题讨论】:
-
Add只需要在调整大小时复制数组,这应该很少发生。如果您从列表末尾以外的任何位置删除,则必须将已删除项之后的元素向下移动到源数组中,这就是Array.Copy调用正在做的事情。 -
如果您更仔细地查看该代码,我想您会发现它不会在每次添加或删除时扩展/复制数组。
-
但是在某些时候,整个元素都会被复制到一个新的数组中;这就是我要说的;为什么没有实际的添加和删除。
-
数组有一个固定的大小,所以增加大小是必要的。它在必要时将数组大小加倍,这是一种摊销 O(1) 复杂度的算法。没有比这更好的了。这会浪费地址空间,但不会浪费物理内存,这要归功于程序运行的按需分页虚拟内存操作系统。否则,数组对于提高引用的局部性非常重要,这对现代处理器来说非常重要,并确保最有效地使用处理器缓存。如果您对最终集合大小有一个很好的猜测,那么设置容量很有用。
标签: c# .net arrays list data-structures