Delphi中虚拟方法表和动态方法表
来源:互联网 发布:鬼泣4特别版卡顿优化 编辑:程序博客网 时间:2024/03/29 14:01
(1)前4个字节存放一个指针,该指针指向另一个地址区域。
(2)其余小区域分别存放对象的各种数据成员。
前四个字节字节的指针指向另一地址区域即“虚拟方法表(virtual method table,VMT)”,虚拟方法表又划分很多个大小为4字节的小区域,每个区域存放一个指针,每个指针对应一个虚拟方法的入口地址;其余小区域存放字段、属性值和所有的非虚方法的入口地址。由此可见废墟方法的存取相对简单,而虚方法的寻址与调用要复杂的多。
1、 虚拟方法表结构
如下图所示,一个对象指针指向一个对象数据域,对象数据域的前四个字节存放一个指针,该指针指向虚拟方法表。
2、VMT的产生
参照虚拟方法结构图,VMT表的负偏移区(-76~0)是基础信息,存储基础性数据(如实例大小、接口表、运行时类型信息表、字段表、方法表、类名和父类虚拟方法表等)的指针和多有的基础性虚拟方法的指针,而不全是指针列表,这个区域主要来帮助实现对象的构造与析构、运行是类型信息存取、字段和方法解析等,大小固定;正偏移区是用户定义的虚拟方法所在区域,每四个字节一个用户定义的虚拟方法指针。这些虚拟方法不仅指在本类定义的,还包括从Tobject一直到本类的所有中间类定义的虚拟方法。
3、虚拟方法与动态方法比较
实际应用中虚方法常见两类:虚拟方法(Virtual)和动态方法(Dyniamic),由上知Virtual方法被全部列入VMT的正偏移区,当一个对象请求调用Virtual方法时,可以在类的VMT中直接寻址,然后调用,除非调用一个Dynamic方法;一个动态方法表(DMT)来存储动态方法的入口地址,这是虚拟方法和动态方法调用的一个重大区别,而DMT又依赖于VMT来实现。DMT是一系列的指针列表,和VMT正偏移类似,存放了本类定义的和从父类继承并覆盖后的动态方法的入口地址。
虚拟方法和动态方法相比,使用动态方法可以节省内存,因为它不存放未曾覆盖的虚方法指针,而且调用一个虚方法和调用在DMT中存放了入口地址的动态方法相比,速度没有显著差异。而如果使用虚拟方法,即使子类没有覆盖父类虚拟方法,子类中和父类也都会存放虚拟方法的入口地址。
转载:http://blog.csdn.net/h_sure/article/details/4013566
- Delphi中虚拟方法表和动态方法表
- 【转载】Delphi中虚拟方法表和动态方法表
- Delphi中虚拟方法表和动态方法表
- 【Delphi】简单测试虚拟方法表 VMT
- DELPHI中的静态虚拟及动态方法函数的区别
- Delphi中Ocx的动态注册方法
- Delphi中动态调用DLL的方法
- Delphi中动态调用DLL的方法
- 虚拟方法 对比 动态方法
- Delphi中对“虚拟列”的处理方法
- Delphi对象的方法能定义- 静态(static)、虚拟(virtual)、动态(dynamic)或消息处理(message)
- delphi程序中动态生成控件的方法
- delphi dll 静态调用和动态调用方法总结
- Delphi动态创建MainMenu和PopupMenu菜单的方法
- delphi中locate方法
- C#中得虚拟方法
- 虚拟服务器实现方法(动态均衡)
- 抽象方法和虚拟方法的区别
- 读书笔记(九)--三分做事,七分做人
- 读书笔记(十)--中国超过美国还要多少年
- 读书笔记(十一)--你能行
- 如何计算时间复杂度
- Android自动化测试工具——Monkey
- Delphi中虚拟方法表和动态方法表
- Servlets进阶(1)----Servlets简介
- JQuery上传插件Uploadify使用详解
- 自由軟體授權分析輔助工具
- Android学习4——猜拳小游戏
- GDI+ 自学2
- 浅谈美国量化宽松政策与中国关系
- 振南的znFAT(第二章_让思想与FAT32接轨)
- Log4j学习。输出日志到数据库。