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

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

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

【问题讨论】:

    标签: arrays memory-management random-access


    【解决方案1】:

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

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

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

    【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2016-12-09
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多