动态方法如何提高代码大小?
代码大小是什么意思???这意味着program.exe文件大小??
根据手册:
一般来说,虚方法是实现多态行为的最有效方式。当基类声明了许多可覆盖的方法时,动态方法很有用,这些方法由应用程序中的许多后代类继承,但只是偶尔被覆盖。
当只有一个继承的类覆盖该方法时,如果我使用动态而不是虚拟,我将获得什么,因为手册还说:
虚拟方法优化速度,而动态方法优化代码大小。
动态方法如何提高代码大小?
代码大小是什么意思???这意味着program.exe文件大小??
根据手册:
一般来说,虚方法是实现多态行为的最有效方式。当基类声明了许多可覆盖的方法时,动态方法很有用,这些方法由应用程序中的许多后代类继承,但只是偶尔被覆盖。
当只有一个继承的类覆盖该方法时,如果我使用动态而不是虚拟,我将获得什么,因为手册还说:
虚拟方法优化速度,而动态方法优化代码大小。
虚拟方法通过虚拟方法表 (VMT) 实现。每个班级有一个 VMT。VMT 为类中的每个虚拟方法包含一个条目。该条目是该方法的地址。
这允许非常有效的调用。您只需获取位于固定偏移量的 VMT 的地址Self
。然后通过索引查找方法指针并调用该方法。
这确实意味着,如果您有一个包含大量虚拟方法的类,并且您派生了一个子类,您将创建一个包含所有虚拟方法的全新 VMT。如果您没有覆盖其中的许多,那么您会发现 VMT 有很多重叠。
这在 16 位时代很重要。VMT 可能会占用可执行映像中的大量空间(这就是代码大小的含义),并且您可能会用完 VMT 的空间。因此引入了动态方法。与 VMT 类似的是动态方法表 DMT。这是以不同的方式实现的,以避免在方法未被覆盖时重复。缺点是调用动态方法更昂贵。
在现代,由于 32 位,尤其是 Delphi 生成的非常胖的可执行文件,这些大小问题并不重要。因此,所有合理的建议都是专门使用虚拟方法。
虚拟方法表的实现很好理解,可以找到很多参考资料来理解它们。对于相当古怪的动态方法来说,情况就不是这样了。我发现的最佳信息来源来自 Hallvard Vassbotn 的博客: