【问题标题】:How can I see VMT in pascal?如何在帕斯卡中看到 VMT?
【发布时间】:2023-10-17 03:58:01
【问题描述】:

我可以在 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;

【问题讨论】:

  • 作为一个有趣的问题,你为什么要问那些已经过时的对象,而不是更现代的类?
  • @MartynA 我只需要了解基于 Pascal 语言的 VMT 是如何工作的。
  • 虽然它是关于 Delphi(FreePascal 的基础),但您可能会发现 this article 很有帮助,尤其是 Allen Bauer 的回答。直到最近,他还是 Borland/Embarcadero 的首席科学家,负责德尔福的开发。

标签: function pascal vmt


【解决方案1】:

我可以在 FREE Pascal 中以某种方式查看 VMT 表吗?

在运行时,您可以使用 TypeOf 内在函数(例如:TypeOf(Obj))获取指向对象实例的 VMT 的指针。返回的 VMT 的内部结构记录在 Free Pascal Programmer's Guide 的 8.2.12 Object types 中。

您还可以在编译时转储 VMT。为此,请使用-al 选项(“列出汇编程序文件中的源代码行”)编译您的程序,并在生成的.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 的指针。 -4s 是负大小的对象,用于验证指向 VMT 的指针。

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

每种对象类型都有一个 VMT。对象之间没有表,VMT 附加到对象本身。

【讨论】: