分类: WINDOWS
2010-06-10 10:51:52
3.Delphi 类的内存结构:
类的内存结构是固定的,编译完成后就无法改变。它主要存储了类的基本信息,派生对象内存大小,虚方法列表,动态方法列表,公开属性和方法列表(published),接口列表,TObject类的一些方法等等有关于构建对象所必须的信息。这些信息的存储位置在SYSTEM单元中有定义:
vmtSelfPtr = -76; 指向虚方法表的指针
vmtIntfTable = -72; 指向接口表的指针
vmtAutoTable = -68; 指向自动化信息表的指针
vmtInitTable = -64; 指向实例初始化表的指针
vmtTypeInfo = -60; 指向类型信息表的指针,这里的数据对于RTTI来说非常重要,它指向一个PTypeInfo类型的指针,有兴趣可以看看TypInfo单元
vmtFieldTable = -56; 指向域定义表的指针(我开始认为是Published Field,但实际查询时却为NIL)
vmtMethodTable = -52; 指向方法定义表的指针(Published)
vmtDynamicTable = -48; 指向动态方法表的指针
vmtClassName = -44; 指向类名字符串的指针
vmtInstanceSize = -40; 对象实例的大小
vmtParent = -36; 指向父类的指针
vmtSafeCallException = -32 deprecated; 以下都是TOBJECT类的一些虚拟方法指针
vmtAfterConstruction = -28 deprecated;
vmtBeforeDestruction = -24 deprecated;
vmtDispatch = -20 deprecated;
vmtDefaultHandler = -16 deprecated;
vmtNewInstance = -12 deprecated;
vmtFreeInstance = -8 deprecated;
vmtDestroy = -4 deprecated;
由上可见,类的过程和方法相关数据都在类的前面放置,经过测试,类定义的变量,按照书写的位置顺序排列,默认4字节对齐,只有Extended是个例外,它有可能前面会空出4字节
在dephi类中,eax 为this指针。