一个引用值的“类型”在内存中存储在哪里?

5

由于引用值作为数据存储在堆中,任何引用值的类型信息存储在哪里?

如果有几个类艺术家的实例;当它们存储在堆中时,.Net如何标记这些内存块作为艺术家的类型?

谢谢!

3个回答

7
void M()
{
   Artist a = new Artist();
}

当调用该方法时,会扩展一个新的堆栈帧,在方法的第一条语句执行之前,CLR有一些准备代码,就像序言一样。在此期间,CLR加载方法中使用的所有类型。在这个例子中,Artist类型将被加载到堆上。但也有可能类型已经存在,因为类型在调用M()之前就被使用了。然后我们来到第一个表达式,一个new语句,它调用类的构造函数。如果你查看生成的CIL,你会看到类似于newobj的东西。这里在堆上分配了一个内存块来存储实例。块的大小取决于类的细节,因为块需要容纳实例的所有数据。通常块由以下内容组成:
Type pointer + Sync root + Instance data

类型指针指向堆上的类型(在序言中加载)。同步根是锁定和同步的记录。实例数据存储实例成员的数据。


参考类型的答案很清晰。但值类型的类型对象存储在哪里?值类型对象是否具有:类型指针+同步根+实例数据附加字段? - Anton Lyhin

3

CLR会在对象实例中存储一些与数据有关的信息。其中之一是指向对象类型的指针。


2
在使用类之前,dotnet运行时会在堆上创建一个对象,存储有关将要使用的类的所有信息。这包括静态字段、指向类可用方法的方法表、类型对象指针(稍后再说)和同步块(用于锁定对象)。
所有对象都有一个类型对象指针,它指向一个存储有关类信息的对象。
例如,如果您有一个Person对象,它将具有指向堆上的对象的类型对象指针,该对象存储有关人员的所有信息。此人员类型对象还将具有指向System.Type对象的类型对象指针,因为它的类型是System.Type(它是一个存储有关对象类型的信息的对象)。
当然,System.Type也是堆上的一个对象,它也具有指向其类型的信息的类型对象指针。正如您可能已经猜到的那样,它指向自己,因为System.Type对象是一个System.Type对象。
当您在对象上调用GetType()时,它只返回特定对象类型对象指针中存储的地址。

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