问题 CLR类内存布局


CLR类的内存布局是什么?

来自C ++背景,具有虚函数的C ++类的内存布局以v表指针开始,然后该类的数据成员在内存中跟随。

具有虚函数的CLR类是否具有v表指针?这个指针是类内存布局中的第一个字段吗?除了程序员定义的数据成员之外,CLR类内存布局中是否还有其他字段?这些额外的字段代表什么?


12377
2018-01-21 09:05


起源

C#类的内存布局通常由JITTER确定,因此仅在运行时显示(尽管有一些例外)。 - Yahia
C#对内存布局无话可说。这是关于CLR类。 - Henk Holterman
如果你想以更实际的方式查看VTable,你可以按照这样的帖子来运行 !DumpMT -MD address 在WinDbg命令, blogs.msdn.microsoft.com/kristoffer/2007/01/02/... - Lex Li


答案:


它是特定于实现的,但是 本文 为CLR v2描述了Microsoft .NET实现中的内容。一世 疑似 CLR v4也是如此,但我无法保证。查找名为“ObjectInstance”的部分以获取详细信息 - 但您可能会发现整篇文章很有趣。

根据文章,基本上有两位标题: 同步块 用于锁定,和 类型参考 这基本上是指向类型信息的指针(包括vtable)。


9
2018-01-21 09:09



谢谢!你指向我的文章似乎是我在寻找的。
这个链接坏了。 :( - Mr Anderson
@MrAnderson:老鼠 - 不知道如何找到它,不幸的是...... - Jon Skeet
@MrAnderson更新的链接在单独的答案中添加。 - Ofek Shilon


最初的“Jit and Run”文章是 仍在身边,作为一个chm文件。只需按照 MSDN说明 能够阅读:

在大多数Windows版本中,您必须先将这些文件保存到您的   本地计算机,然后取消阻止该文件以便读取它。至   取消阻止文件,右键单击它,然后选择属性,然后   选择“解锁”按钮。然后将提供内容   读

然而,古老的Jon Skeet猜错了 - 对象内存布局确实发生了变化。 Sasha Goldstein对布局进行了最新(CLR v4)调查, 这里


1
2017-07-24 10:56