C# 内存中对象的大小

C# 内存中对象的大小,c#,memory,C#,Memory,如果我有一个包含100个属性的类,这些属性都是int32,我列举了100个这样的对象,那么在设置任何属性之前,它是否需要占用40000字节加上对象需要的任何其他开销,或者在您第一次实际为预属性赋值之前,部分或全部空间是否保持未分配状态?当创建对象时,立即为所有字段分配内存。请注意,对象的大小还包括对象标题、填充等。创建对象时,会立即为所有字段分配内存。请注意,对象的大小还包括对象标题、填充等。只要实例化对象,就可以使用内存,因为int是一种值类型 引用类型的工作方式略有不同。如果要生成属性字符串

如果我有一个包含100个属性的类,这些属性都是int32,我列举了100个这样的对象,那么在设置任何属性之前,它是否需要占用40000字节加上对象需要的任何其他开销,或者在您第一次实际为预属性赋值之前,部分或全部空间是否保持未分配状态?

当创建对象时,立即为所有字段分配内存。请注意,对象的大小还包括对象标题、填充等。

创建对象时,会立即为所有字段分配内存。请注意,对象的大小还包括对象标题、填充等。

只要实例化对象,就可以使用内存,因为int是一种值类型


引用类型的工作方式略有不同。如果要生成属性字符串而不是整数,则仍然会使用~40000字节,但不会更多,因为此时字符串都是空引用。空引用仍然为引用保留空间。当您开始为字符串设置值时,您将开始使用空格。

您将在实例化对象时立即使用内存,因为int是一种值类型

引用类型的工作方式略有不同。如果要生成属性字符串而不是整数,则仍然会使用~40000字节,但不会更多,因为此时字符串都是空引用。空引用仍然为引用保留空间。当您开始为字符串设置值时,您将开始使用空格。

Int32与所有值类型一样,具有默认值。0

是的;一旦创建这些Int32变量,它们就会占用内存。

Int32和所有值类型一样,都有一个默认值。0


是的;一旦创建这些Int32变量,它们就会占用内存。

所有类范围的字段都是在实例化后分配的,这与局部范围的变量不同,局部范围的变量可以无限期地保持未分配状态。因此,值类型使用其适当的大小,而引用使用移动指针的大小,无论它们在类级别的作用域是什么

还要注意的是,除非布局像在结构或显式中那样是顺序的,否则大多数值类型将被填充到至少32位


预测一个空引用将消耗多少空间并不总是简单的,但是如果它们是普通的指针,那么在x86平台上它们将消耗4字节,在x64平台上消耗8字节。

所有类范围的字段都是在实例化后分配的,这与局部范围的变量不同,后者可以无限期地保持未分配状态。因此,值类型使用其适当的大小,而引用使用移动指针的大小,无论它们在类级别的作用域是什么

还要注意的是,除非布局像在结构或显式中那样是顺序的,否则大多数值类型将被填充到至少32位



预测一个空引用将占用多少空间并不总是那么简单,但如果它们是普通指针,在x86平台上它们将占用4字节,在x64平台上它们将占用8字节。

那么我是否正确理解空引用占用4字节,或者这一定是真的?那么我是否正确理解了空引用占用4个字节,或者这一定是真的?啊。。。我知道,但只是忘了连接,他们显然必须把默认值放在某个地方:啊。。。我知道这一点,但只是忘记了联系,他们显然必须把默认值放在一些地方:否决票怎么了,没有解释。。。你知道,这让我很伤心。好吧,有三个人反驳了,所以你应该没事。@Zenexer世界上一切都好起来了:否决票和没有解释是怎么回事。。。你知道,这让我很伤心。好吧,有三个人反对,所以你应该没事。@Zenexer世界上一切都好:那么你是说如果我在一个方法中声明8个不同的位变量,那么它仍然会占用8个字节?我想这是因为在32位系统上,寄存器是32位的,尝试将它们打包在一起会比较慢?我不太确定我是否正确理解您的意思,但是如果您有一个包含两个布尔字段的类,由于填充的原因,默认情况下它将消耗64位。作为一个结构,它将消耗16位。您还可以将[StructLayoutKind.Sequential]置于类声明之上,以强制禁用填充。我指的是以下代码行:boola,b,c,d,e,f,g,h;将占用16字节我第一次说的是8,但实际上是16。在任何情况下都不会占用16字节。如果没有填充,它将占用8个字节,如果有填充,它将占用32个字节。它也不会占用64位。32字节为32*8=256位。值类型必须消耗整个字节:因此,bool消耗一个字节或8位。如果你有8个布尔,你就有8个字节,未添加。所以你是s
如果我在一个方法中声明8个不同的位变量,那么它仍然会占用8个字节?我想这是因为在32位系统上,寄存器是32位的,尝试将它们打包在一起会比较慢?我不太确定我是否正确理解您的意思,但是如果您有一个包含两个布尔字段的类,由于填充的原因,默认情况下它将消耗64位。作为一个结构,它将消耗16位。您还可以将[StructLayoutKind.Sequential]置于类声明之上,以强制禁用填充。我指的是以下代码行:boola,b,c,d,e,f,g,h;将占用16字节我第一次说的是8,但实际上是16。在任何情况下都不会占用16字节。如果没有填充,它将占用8个字节,如果有填充,它将占用32个字节。它也不会占用64位。32字节为32*8=256位。值类型必须消耗整个字节:因此,bool消耗一个字节或8位。如果有8个布尔,则有8个字节,未添加。