动态和虚拟方法有什么区别?

时间:2013-03-14 17:56:57

标签: delphi

动态方法如何改进代码大小?
什么代码大小意味着???它表示program.exe文件大小??

根据手册:

  

通常,虚拟方法是最有效的实现方式   多态行为。动态方法在基类时很有用   声明了许多可以继承的可覆盖方法   应用程序中的后代类,但仅偶尔出现   重写的。

如果我只使用其中一个继承的类覆盖该方法,那么当我使用dynamic而不是virtual时我会得到什么,因为手册中也说:

  

虚拟方法优化速度,而动态方法优化代码大小。

1 个答案:

答案 0 :(得分:41)

虚拟方法使用虚拟方法表(VMT)实现。每个班级都有一个VMT。 VMT包含类中每个虚拟方法的一个条目。该条目是该方法的地址。

这允许非常有效的呼叫。您只需获取VMT的地址,该地址位于Self的固定偏移处。然后按索引查找方法指针并调用方法。

这意味着如果你有一个包含大量虚拟方法的类,并且你派生了一个子类,你将使用所有虚拟方法创建一个全新的VMT。如果你没有覆盖其中许多,那么你会发现VMT有很多重叠。

这在16位的日子里很重要。 VMT可能占用可执行映像中的大量空间(这就是代码大小的含义),并且VMT可能会耗尽空间。因此引入了动态方法。与VMT类似的是动态方法表DMT。这是以不同方式实现的,以避免在不覆盖方法时重复。缺点是调用动态方法更加昂贵。

在现代,由于32位,特别是Delphi产生的非常胖的可执行文件,这些大小问题并不重要。因此,所有合理的建议都是专门使用虚拟方法。

虚拟方法表的实现很好理解,可以找到很多参考来理解它们。对于相当古怪的动态方法来说,情况就不那么好了。我发现的最好的信息来源是Hallvard Vassbotn的博客: