SOS调试中的对象大小 C#.Net

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个字节是对象实例化时的额外开销。有人能解释一下吗?

如果您对一些深入的细节感兴趣,这里是微软关于.NET 2.0运行时对象布局的深入描述:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx#S15 - Michael Graczyk
不错的文章。我已经阅读过了。Jeff Ritcher在CLR via C#中分享了很棒的内容。 - C-va
2个回答

4
每个引用对象都附加了两个额外的字段: Object type ptr:4字节(指向包含引用类型方法表的结构的内存地址(特定于AppDomain),该对象被实例化或指向) Sync block adress:4字节(同步块地址,指向进程范围表中的位置,该表包含用于同步访问引用类型实例的结构)
更多信息请查看此文章中的内存布局。

1

在对象结构的顶部,您有8个字节的信息:

4个字节用于对象引用

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

换句话说:

<--SyncBlock(4字节)--><--ObjectReferece(4字节)--><--您的对象数据-->

要了解更多信息,请查看:

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


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