0

我能以某种方式在 FREE Pascal 中看到 VMT 表吗?如果 VMT 表在通过遗传连接的两个对象中具有相同数量的项目,我很感兴趣?

例如在这个模型中,VMT 表中会有什么?

所有功能或更多功能是否会有一张表( [Ob1 AND Ob2] 之间的表格和 [Ob2 AND Ob3] 之间的表格)?

表格中会有什么?

Ob1 = object
  constructor Init;
  function f1..; virtual;
  function f2..; virtual;
end;


Ob2 = object(Ob1)
  constructor Init;
  function f1...; virtual;
  function f2...; virtual;
  function f3...; virtual;
end;

Ob3 = object(Ob2)
  constructor Init;
  function f1...; virtual;
  function f2...; virtual;
  function f3...; virtual;
end;
4

1 回答 1

0

我能以某种方式在 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 附加到对象本身。

于 2020-07-22T05:57:07.377 回答