VMT & DMT
虚拟方法表和动态方法表
虚拟方法表VMT:
一个虚拟方法表从指针所指地址的负偏移.76 处开始,长度动态分配(由虚拟方法的个数确定)。虚拟方法表被分为很多小段,每段占4 个字节,也就是众多指针。每个指针指向一个虚拟方法的入口地址。
VMT可分为
1) 基础信息区
VMT负偏移区(-76-0)即为基础信息区。存储了基础数据(如实例大小)、基础数据的指针(如接口表、运行时类型信息表、字段表、方法表、类名和父类虚拟方法表等)和所有基础性虚拟方法的指针。这个区域的数据和指针帮助实现对象的构造和析构、运行时类型信息存取、字段和方法解析等。大小是固定的。
2) 用户定义虚拟方法区
VMT正偏移区即为用户定义虚拟方法(即所有非Object定义的虚拟方法)区。每4个字节存储一个用户定义的虚拟方法指针。这些虚拟方法包括本类中定义的虚拟方法以及从TObject一直到本类的所有中间类定义的所有虚拟方法。
VMT由编译器给程序中每个需要要用到的类自动生成,VMT对应的是类而不是类实例。
动态方法表DMT
对于一个类,它用另外一个DMT来存储动态方法的入口地址。DMT是一系列指针的列表,与VMT正偏移区类似。存放了本类的定义和从父类继承并覆盖了的动态方法的入口地址。所以,未曾覆盖的动态方法的指针不会保存在DMT中,节省了内存。如果要调用DMT没有入口地址的动态方法时,就需要到其父类及以上(如果还没有的话)的DMT寻址。
VMT & DMT的更多相关文章
- C++构造函数的自动调用(调用一个父类的构造函数,有显性调用最好,否则就默认调用无参数的构造函数)——哲学思想:不调用怎么初始化父类的成员数据和VMT?
我总是记不住构造函数的特点,关键还是没有领会那个哲学思想:父类的构造函数一方面要初始化它自己的成员数据,另一方面也要建立它自己的VMT呀!心里默念一百遍:一定调用父类构造函数,一定调用父类构造函数,一 ...
- FreePascal的VMT与Delphi不一致,没有负方向
因为不需要与C++兼容嘛:http://www.freepascal.org/docs-html/prog/progsu168.html 如果要想取得它真正的VMT,可以Pointer强行转换+100 ...
- Delphi的VMT的结构图,很清楚
Every Delphi class is defined internally by its vmt—its virtual-method table. The vmt contains a li ...
- 访问祖先类的虚方法(直接访问祖先类的VMT,但是这种方法在新版本中未必可靠)
访问祖先类的虚方法 问题提出 在子类覆盖的虚方法中,可以用inherited调用父类的实现,但有时候我们并不需要父类的实现,而是想跃过父类直接调用祖先类的方法. 举个例子,假设有三个类,实现如下: t ...
- 纠正一个概念:类就有VMT,各实例不过是共享这个VMT而已
不是只有实例才有VMT,举个例子,各实例的VMT地址是相同的: Use System.Contnrs; procedure TForm1.BitBtn2Click(Sender: TObject); ...
- DELPHI 对象的本质 VMT
http://www.cnblogs.com/little-mat/articles/2206627.html TObject是所有对象的基本类,DELPHI中的任何对象都是一个指针,这个指针指明该对 ...
- Locally managed (LMT) vs. Dictionary managed (DMT) tablespace
The LMT is implemented by adding the extent management local clause to the tablespace definition syn ...
- 计算VMT的长度
function GetVirtualMethodCount(AClass: TClass): Integer; begin Result := (PInteger(Integer(AClass) + ...
- Delphi VMT的前世今生(研究一下D7的VMT表结构)
主要是TObject那些虚函数,到底放在了哪里?
随机推荐
- 菜鸟-手把手教你把Acegi应用到实际项目中(12)-Run-As认证服务
有这样一些场合,系统用户必须以其他角色身份去操作某些资源.例如,用户A要访问资源B,而用户A拥有的角色为AUTH_USER,资源B访问的角色必须为AUTH_RUN_AS_DATE,那么此时就必须使用户 ...
- JavaScript对象的创建之构造函数
通过构造函数的方式创建和基于工厂的创建类似,最大的区别就是函数的名称就是类的名称,按照java的约定,第一个字母大写. 使用构造函数创建对象时,在函数内部是通过this关键字来完成属性的定义. fun ...
- Junit4
package test.code; import static org.junit.Assert.*; import org.junit.Test; import code.MyCode; publ ...
- java解析xml的4种经典方法
========================================== xml文件 <?xml version="1.0" encoding="GB2 ...
- cookie、session、sessionid 与jsessionid
可查看 http://www.cnblogs.com/fnng/archive/2012/08/14/2637279.html
- 【Robot Framework】robot framework 学习以及selenium、appnium、requests实践(三)
看了上一章的内容,想必较为简单的case也都会编写了吧,但是是不是觉得,如果能够实现用例参数化,是不是会节省很多劳动力,这节就来学下RF中的user keywords,会让你发现写用例原来可以这么简单 ...
- 百度面试题:从输入url到显示网页,后台发生了什么?
参考http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ http://www.cnblogs.com/we ...
- random类的使用
小栗子a如下: string[] punch = new[] { "石头", "剪刀", "布" }; string myPunch; pu ...
- TRMM数据的读取
编辑下头文件,就有投影信息,然后再转换成你需要的投影方式1) From the command line, type in, ENVI, 2) Click File|Open External Fil ...
- docker1.12 安装redis第三方集群方案 codis
docker1.12 安装redis第三方集群方案 codis