c# - List<> 元素是否像数组一样按顺序位于堆中?

标签 c# .net

我正在学习 C#,基本上知道数组和 List 之间的区别,后者是通用的并且可以动态增长,但我想知道:

  • List 元素是像数组一样按顺序位于堆中,还是每个元素“随机”位于不同位置?
  • 如果这是真的,那会影响从内存中访问和检索数据的速度吗?
  • 如果这是真的,这就是数组比 List 快一点的原因吗?

最佳答案

先来看第二个和第三个问题:

and if that true does that affect the speed of access & data retrieval from memory ?

and if that true is this what makes array little faster than list ?

.NET 中只有一种类型的“ native ”集合(对于 .NET,我指的是 CLR,所以是运行时):数组(从技术上讲,如果您将 string 视为一种集合,则是两种 native 类型的集合 :-) )(技术上第 2 部分:并非所有您认为是数组的数组都是“ native ”数组...只有基于 0 的一维数组是“ native ”数组。T[,] 类型的数组不是,第一个元素的索引不是 0 的数组不是)。所有其他集合(LinkedList<> 除外)都建立在它之上。如果您查看 List<T>IlSpy你会看到在它的底部有一个 T[]添加了 int对于 Count (T[].LengthCapacity )。显然数组比 List<T> 快一点因为要使用它,您就少了一个间接访问(直接访问数组,而不是访问访问列表的数组)。

我们来看第一个问题:

does List elements sequentially located in heap like array or each element is located randomly in different locations?

内部基于数组,显然 List<>像数组一样记住它的元素,所以在一个连续的内存块中(但要注意 List<SomeObject> 其中 SomeObject 是一个引用类型,该列表是引用的列表,而不是objects,所以引用被放在一个连续的内存块中(我们将忽略计算机的高级内存管理,“连续内存块”这个词并不准确),它应该是最好说“一个连续的地址 block ”))

(是的,即使 Dictionary<>HashSet<> 也是构建在数组之上的。相反,树状集合可以在不使用数组的情况下构建,因为它更类似于 LinkedList )

一些额外的细节:在 CIL 中有四组指令与“ native ”数组一起使用的语言(在已编译的 .NET 程序中使用的中间语言):

  • Newarr

  • Ldelem和家人Ldelem_*

  • Stelem和家人Stelem_*

  • ReadOnly (别问我用处,我也不知道,文档也不清楚)

如果你看OpCodes.Newarr您会在 XML 文档中看到这条评论:

// Summary:
//     Pushes an object reference to a new zero-based, one-dimensional array whose
//     elements are of a specific type onto the evaluation stack.

关于c# - List<> 元素是否像数组一样按顺序位于堆中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18171131/

相关文章:

c# - Azure 函数使用不正确的 DLL 版本

c# - 以编程方式创建/删除 Windows Media Services 发布点

c# - 如何设置 ListBoxItem 的样式

c# - 当混合使用同步方法时,在 Web API 中实现异步/等待的好处

c# - 让机器人每天在特定时间发送消息

c# - 为接口(interface)属性提供一个重要的 setter,但不是 getter

c# - Html.DropDownList 如果为空则禁用

c# - 设置服务器名称指示 (SNI) 取消证书绑定(bind)

c# - XAML-创建类的实例

c# - 无法加载文件或程序集 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 或其依赖项之一