Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#中的对象数组占用了多少内存?_C#_Arrays_Memory - Fatal编程技术网

c#中的对象数组占用了多少内存?

c#中的对象数组占用了多少内存?,c#,arrays,memory,C#,Arrays,Memory,假设我们之前已经实例化了类D中的三个对象A、B、C 现在,数组定义如下: D[]arr=新的D[3]; arr[0]=A; arr[1]=B; arr[2]=C 数组包含对对象的引用还是有单独的副本?数组由指向对象的指针(32位或64位)组成。对象是引用类型,只有值类型被复制到数组本身。引用类型数组只包含引用 在32位应用程序中,引用是32位(4字节),而在64位应用程序中,引用是64位(8字节)。因此,可以通过将数组长度乘以参考大小来计算近似大小。(还有一些额外的字节用于数组类的内部变量,还有

假设我们之前已经实例化了类D中的三个对象A、B、C 现在,数组定义如下: D[]arr=新的D[3]; arr[0]=A; arr[1]=B; arr[2]=C


数组包含对对象的引用还是有单独的副本?

数组由指向对象的指针(32位或64位)组成。对象是引用类型,只有值类型被复制到数组本身。

引用类型数组只包含引用


在32位应用程序中,引用是32位(4字节),而在64位应用程序中,引用是64位(8字节)。因此,可以通过将数组长度乘以参考大小来计算近似大小。(还有一些额外的字节用于数组类的内部变量,还有一些额外的字节用于内存管理。)

正如@Yves所说,它有对对象的引用。数组是一个内存块,就像在C中一样。 所以它的大小是sizeof(element)*count+oop所需的内存量

C#区分引用类型和值类型

引用类型是使用一词声明的。这些类型的变量包含引用,因此数组将是对象引用的数组。每个引用的大小为4字节(在32位系统上)或8字节(在64位系统上)

使用单词struct声明值类型。每次指定此类型的值时,都会复制这些值。值类型的数组包含值的副本,因此数组的大小是结构的大小乘以元素的数量


通常,当我们说“object”时,我们指的是引用类型的实例,因此您的问题的答案是“yes”,但请记住区别,并确保您不会意外地创建大型结构的大型数组。

您可以使用WinDBG+SOS(或PSSCOR2)查看数组占用的内存。IIRC,一个引用类型数组在内存中由其长度表示,后面是对其元素的引用,即它的确切大小是
PLATFORM\u POINTER\u size*(array.length+1)

引用,因为它们是对象。