对象数组如何存储在内存中?

Posted

技术标签:

【中文标题】对象数组如何存储在内存中?【英文标题】:How is an array of object[]s stored in memory? 【发布时间】:2012-08-25 01:47:52 【问题描述】:

据我了解,数组的元素连续存储在内存中,访问特定的元素是通过将所需索引和每个元素的大小与基数组地址的乘积相加来找到地址来完成的元素。

由于在 C# 之类的语言中,我可以创建一个 object[]s 数组并将我想要的任何数据类型放入其中,如果我使用不同大小的数组的每个元素如何以统一的长度存储(并保持)类型同时仍然允许随机访问?

【问题讨论】:

【参考方案1】:

这取决于所讨论的语言以及“对象”的含义 -

正如您提到的 C#,在 C# (.NET) 中,object[] 包含对单个对象实例的引用数组。该数组是一个引用数组——对象实例仍然需要分配给数组的一个元素。 references 具有统一的大小,但对象实例本身是单独存储的,并且不必具有相同的大小。

这在大多数语言中存储“引用”或“指针”数组时是相同的,而不是对象实例本身。

【讨论】:

啊哈!我是这么想的。但这意味着无论将什么类型放入数组中,所有内容都会隐式转换为object? (这不是装箱/拆箱吗?) @daniel 装箱是在堆中存储非引用类型的行为。引用类型(例如,字符串)已经存储在堆上,因此不会复制数据 - 您只是将数组中特定索引处的值设置为已经在堆上的对象的地址。 【参考方案2】:

对象是引用类型。地址处的值实际上是一个指向真正元素的指针。

【讨论】:

以上是关于对象数组如何存储在内存中?的主要内容,如果未能解决你的问题,请参考以下文章

c++中数组和对象的数据是存储在栈内存还是堆内存?

值类型数组如何存储在 .NET 对象堆中?

PHP 操作大对象 数组如何节省内存

Java数组在内存中是啥样的

将自定义分配的对象存储在数组中。内存管理

Java中的数组以及它们如何存储在内存中