动态方法如何改进代码大小?
什么代码大小意味着??? 它意味着program.exe文件大小??
根据手册:
通常,虚方法是实现多态行为的最有效方法.当基类声明许多可覆盖的方法时,动态方法很有用,这些方法由应用程序中的许多后代类继承,但只是偶尔被覆盖.
当我只使用其中一个继承的类覆盖该方法时,如果我使用dynamic而不是virtual,我会得到什么,因为手册中还说:
虚拟方法优化速度,而动态方法优化代码大小.
Dav*_*nan 42
虚拟方法使用虚拟方法表(VMT)实现.每个班级都有一个VMT.VMT包含类中每个虚拟方法的一个条目.该条目是该方法的地址.
这允许非常有效的呼叫.您只需获取位于固定偏移处的VMT的地址Self.然后按索引查找方法指针并调用方法.
这意味着如果你有一个拥有大量虚拟方法的类,并且你派生了一个子类,你将使用所有虚拟方法创建一个全新的VMT.如果你没有覆盖其中的许多,那么你会发现VMT有很多重叠.
这在16位的日子里很重要.VMT可能占用可执行映像中的大量空间(这就是代码大小的含义),并且VMT可能会耗尽空间.因此引入了动态方法.与VMT类似的是动态方法表DMT.这是以不同方式实现的,以避免在不覆盖方法时重复.缺点是调用动态方法更昂贵.
在现代,由于32位,特别是Delphi产生的非常胖的可执行文件,这些大小问题无关紧要.因此,所有合理的建议都是专门使用虚拟方法.
虚方法表实现很好理解,可以找到许多引用来理解它们.对于相当古怪的动态方法来说,情况就不那么好了.我发现的最好的信息来源是Hallvard Vassbotn的博客:
| 归档时间: |
|
| 查看次数: |
7659 次 |
| 最近记录: |