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

EPr*_*und 21 delphi

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

根据手册:

通常,虚方法是实现多态行为的最有效方法.当基类声明许多可覆盖的方法时,动态方法很有用,这些方法由应用程序中的许多后代类继承,但只是偶尔被覆盖.

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

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

Dav*_*nan 42

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

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

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

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

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

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

  • 如果DMT将被排序(由编译器),则Delphi中的DMT实现(主要用于调度窗口消息)可以快得多,因此可以使用二进制搜索而不是线性搜索来找到方法指针. (4认同)
  • +1很好解释!! 非常感谢!!我会读完整篇论文 (2认同)