由于引用值作为数据存储在堆中,任何引用值的类型信息存储在哪里?
如果有几个类艺术家的实例;当它们存储在堆中时,.Net如何标记这些内存块作为艺术家的类型?
谢谢!
void M()
{
Artist a = new Artist();
}
Artist
类型将被加载到堆上。但也有可能类型已经存在,因为类型在调用M()
之前就被使用了。然后我们来到第一个表达式,一个new
语句,它调用类的构造函数。如果你查看生成的CIL,你会看到类似于newobj
的东西。这里在堆上分配了一个内存块来存储实例。块的大小取决于类的细节,因为块需要容纳实例的所有数据。通常块由以下内容组成:Type pointer + Sync root + Instance data
类型指针指向堆上的类型(在序言中加载)。同步根是锁定和同步的记录。实例数据存储实例成员的数据。
CLR会在对象实例中存储一些与数据有关的信息。其中之一是指向对象类型的指针。