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

3
据我理解,一个数组的元素在内存中是连续存储的,通过将所需索引和每个元素大小的积与基本数组地址相加找到元素地址来访问特定元素。
在像C#这样的语言中,我可以创建一个object[]数组,并在其中放置任何我想要的数据类型,那么如果我使用不同大小的类型,如何使数组的每个元素以统一长度存储(并保持)而仍允许随机访问呢?
2个回答

5
这取决于语言以及您所说的“对象”的含义。例如在C#(.NET)中,一个object[]包含对各个对象实例的引用数组。该数组是引用数组,对象实例仍需要分配给数组的元素。这些引用具有统一的大小,但对象实例本身是单独存储的,它们的大小也不必相同。当存储“引用”或“指针”的数组时,大多数语言都是如此。

啊哈!我就知道。但这意味着无论什么类型被放入数组中,所有东西都会被隐式转换为 object 并从中转换出来?(这不是装箱/拆箱吗?) - daniel
@daniel boxing是指将非引用类型存储在堆中。引用类型(例如字符串)已经存储在堆中,因此不需要复制数据-您只需将数组中特定索引处的值设置为已经存在于堆上的对象的地址即可。 - Chris Shain

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接