【发布时间】:2016-08-30 05:24:39
【问题描述】:
鉴于数组被分配了固定的内存区域,因此数组的长度是不可变的,这完全有道理。
假设我有 Array[10] - 这将分配 10 个相邻内存插槽,对吗?这是因为这些插槽是相邻的并且在预定的位置,基于索引的查找很快。
但是,如果我将复杂类型放入我的数组中,大小不均。数组中的实际对象可能属于同一类型,但它们所保存的数据的大小可能会有很大差异。
.Net 如何处理这个问题?我想它会分配非顺序内存来存储对象中的实际数据,但我想要一个权威的答案。例如 - 如果对象超过一定大小,它是否只使用非顺序内存?如果对象的大小不断变化,它会继续尝试优化存储位置吗?
考虑这个类:
public class MyClass
{
public MyClass[] PotentiallyHugeNestedStructure
}
现在,如果我有一个 myclass 数组并在运行时开始分配给子数组和子数组。我最终会得到大量的锯齿状数组。
那么 .net 在内存中是如何处理这个问题的呢?
【问题讨论】:
-
数组中的实际对象 ?!不,数组包含对对象内存位置(在托管堆中)的引用,而不是对象本身!
-
@user3185569,所以它们真的只是一个顺序链表?
-
The actual objects in the array might be of the same type, but the data they hold can differ vastly in size即使数据不同,每个索引分配的存储空间是相同的(int 4 字节),只要分配的内存可以保存为该块存储的值 -
如果我不得不猜测,我会说锯齿状数组项目是按顺序存储的,存储的是对实际对象的引用。我真的不知道,我对答案很感兴趣
-
数组元素总是固定大小。如果它们是引用类型,那么元素本身就是引用(x86 上为 32 位,x64 上为 64 位等)。如果它们是值类型,那么每个值的大小总是相同的,每个数组元素也是如此。