3
class Book
{
    public int ISBN { get; set; }      
}

void Method() 
{
  Book book = new Book(); 
  // Break and verify in SoS Debugging.
}


   !dumpheap -type Book
   PDB symbol for clr.dll not loaded
   Address       MT     **Size**
   00c6b76c 009b7f2c       **12**      
   total 0 objects
   Statistics:
   MT    Count    TotalSize Class Name
   009b7f2c        1           12 GCTest.Book
   Total 1 objects

这里对象的大小是 12 字节。它只包含一个整数属性。sizeof(int) = 4 字节剩余 8 字节?(对象实例化)。任何人都可以阐明一些观点。

4

2 回答 2

4

每个参考对象都附加了两个额外的字段:

Object type ptr : 4 个字节(内存地址(特定于 AppDomain),其中包含一个结构,该结构保存引用类型的方法表,对象被实例化或指向

Sync block adress: 4 字节(同步块地址并指向进程范围表中的位置,该表包含用于同步访问引用类型实例的结构

更多信息检查本文中的内存布局

于 2012-07-16T12:32:27.823 回答
1

您在对象结构之上有 8 个字节的信息:

4 个字节用于对象引用

syncblk 4 个字节:用于同步的特殊内存块。在您的特定情况下,它将设置为 0,因为您的对象不参与任何同步操作。

换句话说:

<--SyncBlock(4bytes)--> <--ObjectReferece(4bytes)--> <--你的对象数据-->

有关更多信息,请查看:

深入了解 .NET Framework 内部结构,了解 CLR 如何创建运行时对象

于 2012-07-16T12:37:44.570 回答