2013-03-14 66 views
19

动态方法如何提高代码大小?
什么代码大小意味着?这意味着program.exe文件的大小?动态和虚拟方法有什么区别?

根据手册:

一般情况下,虚方法是实现 多态行为的最有效方式。当一个基类 声明是由许多 派生类在应用程序中继承许多重写的方法,但只是偶尔 覆盖动态方法是有用的。

I增益如果当只有继承类的一个覆盖的方法我使用动态的,而不是虚拟的,因为手动还表示:

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

+0

两个引号告诉你,你需要知道的。底线是,在我看来,总是使用虚拟。 – 2013-03-14 18:05:29

+0

@DavidHeffernan张贴编辑! – EProgrammerNotFound 2013-03-14 18:07:17

回答

38

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

这样就可以非常有效的呼叫。您只需获取位于与Self固定偏移量的VMT的地址。然后通过索引查找方法指针并调用方法。

什么这是否意味着是,如果你有很多的虚拟方法的类,你得到一个子类,你会做一个全新的VMT所有的虚方法。如果你没有覆盖很多,那么你会发现VMT有很多重叠。

这适用于16位的天无关紧要。 VMT可能会占用可执行映像中的大量空间(这就是代码大小),并且VMT可能会用尽空间。所以引入了动态方法。与VMT类似的是动态方法表DMT。这是以不同的方式实现的,以避免重写方法时的重复。缺点是调用动态方法会更昂贵。

到了近代,由于32位,特别是与很肥的可执行文件,德尔福产生,这些大小问题并不重要。所以所有的建议都是纯粹使用虚拟方法。

虚拟方法表的实现是很好理解的,有许多文献可以发现,以了解他们。对于那些相当古怪的动态方法来说,情况并不那么如此。我发现最好的信息来源是Hallvard Vassbotn的博客:

+0

+1与最新的Delphi版本生成的巨大可执行文件大小进行比较时,动态增益确实是徒劳的。 – 2013-03-14 19:54:43

+2

+1非常好的解释!非常感谢!!我将阅读整篇文章 – EProgrammerNotFound 2013-03-14 19:59:28

+4

如果DMT将被排序(由编译器),那么Delphi中的DMT实现(主要用于调度窗口消息)可能会更快,因此可以使用二进制搜索而不是线性搜索找到方法指针。 – 2013-03-14 21:05:04

相关问题