gpt4 book ai didi

.net - 在对象布局中看不到同步块(synchronized block)

转载 作者:行者123 更新时间:2023-12-04 06:08:57 24 4
gpt4 key购买 nike

据我了解,所有 .NET 对象实例都以 8 字节“对象头”开头:一个同步块(synchronized block)(指向 SynchTableEntry 表的 4 字节指针)和一个类型句柄(指向类型方法表的 4 字节指针)。

我在 VS 2010 RC (CLR 4.0) 调试器内存窗口中没有看到这一点。

这是一个简单的类,它将生成一个 16 字节的实例,减去对象头。

class Program
{
short myInt = 2; // 4 bytes
long myLong = 3; // 8 bytes
string myString = "aString"; // 4 byte object reference

// 16 byte instance

static void Main(string[] args)
{
new Program();
return;
}
}

SOS 对象转储告诉我对象总大小为 24 字节。这就说得通了。我的 16 字节实例加上一个 8 字节对象头。

!转储对象 0205b660
名称:Offset_Test.Program
方法表:000d383c
EE类:000d13f8
大小:24(0x18)字节
文件:C:\Users\Bob\Desktop\Offset_Test\Offset_Test\bin\Debug\Offset_Test.exe
领域:
MT 字段偏移类型 VT Attr 值名称
632020fc 4000001 10 System.Int16 1 实例 2 myInt
632050d8 4000002 4 System.Int64 1 实例 3 myLong
631fd2b8 4000003 c System.String 0 实例 0205b678 myString

这是原始内存:

0x0205B660 000d383c 00000003 00000000 0205b678 00000002 ...

这里有一些注释:

offset 0 000d383c ;TypeHandle(指向 MethodTable 的指针),4 个字节
偏移量 4 00000003 00000000 ;myLong, 8 个字节
offset 12 0205b678 ;myString, GC Heap 上“myString”地址的 4 字节引用
偏移量 16 00000002 ;myInt, 4 字节

我的对象从地址 0x0205B660 开始。但我只能占它的 20 个字节,类型句柄和实例字段。没有同步块(synchronized block)指针的迹象。对象大小报告为 24 字节,但调试器显示它仅占用 20 字节的内存。

我正在阅读 Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects ,并期望我的对象的前 4 个字节是一个归零的同步块(synchronized block)指针,如该文章的图 8 所示。当然,这是一篇关于 CLR 1.1 的文章。

我只是想知道我所看到的与这篇早期文章报告的区别是否在于调试器的对象布局显示或 CLR 在 1.1 之后的版本中布局对象的方式发生了变化。

无论如何,谁能解释我丢失的 4 个字节?

最佳答案

我相信同步块(synchronized block)在内存中的对象指针“后面”。这样一个引用变量直接指向方法表。因此,对于地址为 0x0205B660 的对象,同步块(synchronized block)将位于地址 0x0205B65C。

关于.net - 在对象布局中看不到同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2618728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com