.NET中的对象布局结构使用反汇编程序

我有兴趣看到对象布局结构,并试图在visual studio中使用反汇编。 以下是我的代码:

class myclass { public int m_a; } myclass myc = new myclass(); myc.m_a = 23; //I am setting a breakpoint after this line 

我打开了Memory1窗口,在地址字段中输入myc。 我在输出窗口中获得了以下详细信息(使用Windows XP PC 32位和英特尔编译器):

  0x0148B7BC 1c 93 a7 00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

似乎在对象数据前面添加了一个额外的指针00a7931c,它将对象大小增加了4个字节。 我的困惑是文档说由于每个对象的标题,对象大小增加了8个字节。 有人可以指点我其他4个字节的位置吗?

从高级.Net调试 – CLR对象的内部结构 :

对象的CLR内部结构是:

[DWORD:SyncBlock] [DWORD:MethodTable指针] [DWORD:引用类型指针] … [值类型字段的值] …

对象标题: [DWORD:SyncBlock]
对象指针: [DWORD:MethodTable指针] [DWORD:引用类型指针] … [值类型字段的值] …

每个对象前面都有一个ObjHeader( 负偏移 )。 ObjHeader具有SyncBlock的索引。

看看0x0148B7B8。 对象结构是:

SyncBlock(ptr size)MethodTable(ptr size)字段……

该引用指向方法表,以允许更快的解除引用(考虑虚拟方法和属性调用与锁定的相对频率)。