无疑,一个Object在CLR中的逻辑结构是相当复杂的。
前段时间,写了一篇CLR探索系列:System.Object内存布局模型及实现研究,侧重从System.Object这个基本类的基本内存布局,实现和结构来研究了下。这是远远不够的。今天就从如何存储一个Object中的Field,Method等信息,这些信息的逻辑组织方式和存储的逻辑结构。
废话不多说,看看就知道了:
首先,给一个图:
这个图,显示了一个Object的MethodTable,EEClass和MethodDescChunk之间的大致关系。至于一个整体的Object的实现的逻辑结构模型图,结构比较复杂,不好画,google了半天也没找到个现成的,就用这个凑合了。
通常,在内存中,对一个instance的ref的这个地址,其实是指向这个instance的MethodTable的。这个内容,我在“System.Object这个基本类的基本内存布局,实现和结构”这篇文章里面也有说,具体是如何实现的可以参照那篇文章。
老规矩,截取点MethdTable里面重要的属性,方法和结构体,总共一个MethodTable的实现,就大概2500多行,(太长了?这仅仅是定义部分),只能截取表示如下了:
class MethodTable
{
// Low WORD is component size for array and string types, zero otherwise
DWORD m_wFlags;
// Base size of instance of this class when allocated on the heap
DWORD m_BaseSize;
//Nmuber of Method
WORD m_wNumMethods;
//Number of Vitural Methods
WORD m_wNumVirtuals;
WORD m_wNumInterfaces;
// LoaderModule. It is equal to the ZapModule in ngened images
PTR_Module m_pLoaderModule;
PTR_MethodTable m_pParentMethodTable;
// This is the way to create a new method table. Don't try cal