C# 在.net中存储连续内存?

C# 在.net中存储连续内存?,c#,.net,arrays,generics,memory-management,C#,.net,Arrays,Generics,Memory Management,我知道.net中的数组是以连续的方式存储的。(内存中) 我也知道List不是。(嗯……不是所有的列表类型……请参见我的第2个问题) 从这里我有两个问题 我知道在4,8,16之后。。。将项目插入列表-列表在内存中重新分配自身 我也知道我可以在ctor中给他发送容量,让他知道我将创建他的大小(以减少重新分配) 问题是为什么?他不连续地存储自己,那么他为什么关心re呢- 分配他自己?(他不必找到可用的和连续的存储单元) 为什么与类列表不同,带结构的列表是在连续内存中分配的 列表不连续存储内存。在内部

我知道
.net
中的
数组
是以连续的方式存储的。(内存中)

我也知道
List
不是。(嗯……不是所有的列表类型……请参见我的第2个问题)

从这里我有两个问题


  • 我知道在4,8,16之后。。。将项目插入列表-列表
    在内存中重新分配自身

    我也知道我可以在ctor中给他发送
    容量
    ,让他知道我将创建他的大小(以减少重新分配)

    问题是为什么
    ?他不连续地存储自己,那么他为什么关心re呢- 分配他自己?(他不必找到可用的和连续的存储单元)

  • 为什么与类列表不同,带结构的列表是在连续内存中分配的

  • 列表
    不连续存储内存。在内部,它使用一个阵列作为存储。当达到容量时,将分配一个新阵列并复制内存

    对于类或结构的
    列表
    实例,这是正确的。但是,当
    T
    是引用类型(类)时,您将存储一个连续的引用列表。类实例不能是连续的,因为可以包含一个包含100个对同一个类实例的引用的列表

    因此,为了解决您的具体问题:

    问题是为什么?他不连续地储存自己,那么为什么他关心重新分配自己呢

    它确实连续地存储项目,这就是为什么需要重新分配

    为什么与类列表不同,带结构的列表是在连续内存中分配的

    两者都是连续存储的,但在第二种情况下(类),您存储的是对类实例的引用列表。

    1)所有对象引用仍然是连续存储的


    2) och类列表仍然必须允许对象像普通对象一样存储。它们不能被强制进入一个连续的数组中,但对它们的引用可能会错过该Oded。。很抱歉,如果我在列表中添加了1项。而且他没有第二个onw的连续位置-他还会重新分配自己吗?@RoyiNamir一旦你添加了超出当前容量的物品,列表就会重新分配。如果创建容量为1的列表,则添加第二项将导致重新分配。对于类来说,这并不可怕,因为您只是重新分配和复制对象引用,而不是对象实例本身。谢谢:)它总是放在我的脑海里。有人能解释一下为什么需要一个列表来连续存储它的数据吗?我知道它需要在集合之上和之外进行随机访问,但是你不能在没有连续内存但有多个块的情况下实现随机访问吗?这样,如果我有一个需要100MB内存的列表,它可以分配5MB的内存块,或者对操作系统来说更有效的东西。我可能遗漏了什么。@zumalifeguard没有“要求”-这只是为特定的收藏所做的决定。有些人已经为.NET实现了块样式集合。连续数据确实允许更快的读取(特别是在内联之后),但代价是更昂贵的创建/添加。它还为构建后的读取提供了更好的缓存一致性。