C# 结构和类对象数组的内存分配

C# 结构和类对象数组的内存分配,c#,arrays,value-type,reference-type,C#,Arrays,Value Type,Reference Type,昨天我在读C#reference,在那里我看到了一份声明。请看下面的声明 上下文: 对一个点使用结构而不是类可以在数量上产生很大的差异 在运行时执行的内存分配。下面的程序创建并初始化一个100点的数组。 通过将Point实现为一个类,可以实例化101个单独的对象,一个用于数组,另一个用于数组 对于100个元素 只有一个对象被实例化,即数组的对象。点实例是在 数组。这种优化可能被误用。使用结构而不是类也会使应用程序运行变慢或占用更多内存,因为按值传递结构实例会导致复制该结构 创造 问题: 这里我的

昨天我在读C#reference,在那里我看到了一份声明。请看下面的声明

上下文:

对一个点使用结构而不是类可以在数量上产生很大的差异 在运行时执行的内存分配。下面的程序创建并初始化一个100点的数组。 通过将Point实现为一个类,可以实例化101个单独的对象,一个用于数组,另一个用于数组 对于100个元素

只有一个对象被实例化,即数组的对象。点实例是在 数组。这种优化可能被误用。使用结构而不是类也会使应用程序运行变慢或占用更多内存,因为按值传递结构实例会导致复制该结构 创造

问题: 这里我的问题是,在值类型和引用类型的情况下,如何进行内存分配

混乱: 为什么参考指南中提到只有一个对象将被初始化。根据我对数组中每个对象的理解,将分配一个单独的内存

编辑:可能重复
这个问题和jason提出的可能重复的问题有点不同。我关心的是在值类型和引用类型的情况下如何分配内存,而这个问题只是解释了值类型和引用类型的概述。

具有引用类型的数组将由引用数组组成。每个参考点指向包含实际对象的内存区域:

array[0] == ref0 -> robj0
array[1] == ref1 -> robj1
...
因此,引用数组有一个内存分配(size:arraylength*sizeof(reference)),每个对象有一个单独的内存分配(sizeof(robj))

具有值类型(如结构)的数组将只包含以下对象:

array[0] == vobj0
array[1] == vobj1
...

因此有一个jst one内存分配,其大小为arraylength*sizeof(vobj)

也许通过一个示例更容易理解引用类型数组和值类型数组之间的区别:

引用类型的数组

每个
以及数组都在堆上分配,数组存储对每个
的引用。您总共需要N+1个分配,其中N是点数。您还需要额外的间接寻址来访问特定
点的字段
,因为您必须通过引用

值类型的数组


每个
直接存储在阵列中。堆上只有一个分配。访问字段不涉及间接寻址。字段的内存地址可以直接从数组的内存地址、数组中项目的索引以及字段在值类型中的位置来计算。

这个问题实际上是重复的。虽然您谈论的是引用或值类型的数组,而不是单个变量,但也可能是相同的问题。谢谢jason的关注。我想我的问题与你的建议有些不同,因为在我的例子中,我知道结构和类之间的区别,我想知道在C#中,在结构数组和类对象数组的情况下,内存分配是如何完成的。再次感谢您的帮助。您提出这个问题的事实表明,事实上您不理解C#中值类型和引用类型之间的区别,因为区别在于内存分配。如DrKoch所示,它要么是对堆上对象的引用数组,要么是作为一个连续内存块的结构(或其他值类型)数组。因此,无论它是在数组中还是在变量中,它都是完全相同的。因此,这是一个重复。
array[0] == ref0 -> robj0
array[1] == ref1 -> robj1
...
array[0] == vobj0
array[1] == vobj1
...