self 指针正偏移, 负偏移为什么内容 Vtable指针在哪儿存。(100分)

  • 主题发起人 主题发起人 golden_future
  • 开始时间 开始时间
G

golden_future

Unregistered / Unconfirmed
GUEST, unregistred user!
从VC 中转入Delphi ,请问delphi 对象的内存布局是怎样的。self指针的正偏移,负偏移为什么内容,vtable 指针在哪儿存。
 
负偏移是TObject的一些函数和动态函数表的内容,正偏移和VC一样都是虚拟函数表
用来支持COM
 
self所指向的内存开始的四字节,存的就是VTable的内存。
从第五个字节开始,依次存放的是这个对象的各个字段,从这个对象最
初的祖先类的字段开始,按继承次序和声明顺序来存放。Self所指的负
方向的内存不关本对象的事。
对Self的第一个“四字节”的内存存放的是VTable的指针,这个指针指
向了一个VMT(虚拟方法表>,这个方法表的负方向的76个字节存放的是
TObject预定义的虚拟方法。正方向存放的是对象的虚拟方法。
 
楼上得说得对!
并且VMT是一个从负偏移地址空间 开始的数据结构,负偏移数据区是VMT的系统数据区,VMT的正偏移数据是用户 数据区(自定义的虚方法地址表)。TObject中定义的有关类信息或对象运行时 刻信息的函数和过程,一般都与VMT的系统数据有关。
 
请各位看以下常量定义。(system)
{ Virtual method table entries }
vmtSelfPtr = -76;
vmtIntfTable = -72;
vmtAutoTable = -68;
vmtInitTable = -64;
vmtTypeInfo = -60;
vmtFieldTable = -56;
vmtMethodTable = -52;
vmtDynamicTable = -48;
vmtClassName = -44;
vmtInstanceSize = -40;
vmtParent = -36;
vmtSafeCallException = -32;
vmtAfterConstruction = -28;
vmtBeforeDestruction = -24;
vmtDispatch = -20;
vmtDefaultHandler = -16;
vmtNewInstance = -12;
vmtFreeInstance = -8;
vmtDestroy = -4;
vmtQueryInterface = 0;
vmtAddRef = 4;
vmtRelease = 8;
vmtCreateObject = 12;
以上定义负偏移是相对于self指针的。如
class function TObject.GetInterfaceTable: PInterfaceTable;
begin
Result := PPointer(Integer(Self) + vmtIntfTable)^;
end;
self指针正偏移前四字节,如你们说是Vtable 指针.那么 , 这里定义的正偏移是相对于哪个地址的,能否介绍一下哪本书中有这方面的介绍?
 
到此结束
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部