我能以某种方式在 FREE Pascal 中看到 VMT 表吗?
在运行时,您可以获得指向具有TypeOf内在对象实例的 VMT 的指针(如下所示:) TypeOf(Obj)
。返回的 VMT 的内部结构记录在Free Pascal Programmer's Guide 的8.2.12 Object types中。
您还可以在编译时转储 VMT。为此,请使用-al
选项(“List sourcecode lines in assembler file”)编译您的程序,并在生成的.s
文件中读取与 VMT 相关的行。对于你的例子,我在我的电脑(Win32 for i386
目标)上得到了这个:
.section .data.n_VMT_$P$PROGRAM_$$_OB1,"d"
.balign 4
.globl VMT_$P$PROGRAM_$$_OB1
VMT_$P$PROGRAM_$$_OB1:
.long 4,-4,0
.long P$PROGRAM$_$OB1_$__$$_F1$$LONGINT
.long P$PROGRAM$_$OB1_$__$$_F2$$LONGINT
.long 0
.section .data.n_VMT_$P$PROGRAM_$$_OB2,"d"
.balign 4
.globl VMT_$P$PROGRAM_$$_OB2
VMT_$P$PROGRAM_$$_OB2:
.long 4,-4
.long VMT_$P$PROGRAM_$$_OB1
.long P$PROGRAM$_$OB2_$__$$_F1$$LONGINT
.long P$PROGRAM$_$OB2_$__$$_F2$$LONGINT
.long P$PROGRAM$_$OB2_$__$$_F3$$LONGINT
.long 0
.section .data.n_VMT_$P$PROGRAM_$$_OB3,"d"
.balign 4
.globl VMT_$P$PROGRAM_$$_OB3
VMT_$P$PROGRAM_$$_OB3:
.long 4,-4
.long VMT_$P$PROGRAM_$$_OB2
.long P$PROGRAM$_$OB3_$__$$_F1$$LONGINT
.long P$PROGRAM$_$OB3_$__$$_F2$$LONGINT
.long P$PROGRAM$_$OB3_$__$$_F3$$LONGINT
.long 0
在这里您可以清楚地看到虚拟方法是从 VMT 中的第四个单元格开始的。VMT 的第一个单元格是对象的大小,第三个是指向父级 VMT 的指针。s 是对象的-4
负大小,用于验证指向 VMT 的指针。
所有功能或更多功能是否会有一张表( [Ob1 AND Ob2] 之间的表格和 [Ob2 AND Ob3] 之间的表格)?
每种对象类型一个 VMT。对象之间没有表,VMT 附加到对象本身。