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那些虚函数,到底放在了哪里?
随机推荐
- 项目管理: Maven 让事情变得简单
http://maven.apache.org/, Maven其实就是为java实现的一个构建工具.他比Ant更高端. 目前,绝大多数开发人员都把 Ant 当作 Java 编程项目的标准构建工具.遗 ...
- NoCache
<META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Ca ...
- Codeforces Round #223 (Div. 2) C
C. Sereja and Prefixes time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Flash与IE奇怪的关键字冲突
我有一个小小的swf文件,用来播放声音,加入到HTML后,在Firefox/chrome下播放正常,唯独IE8提示 消息: 对象不支持此属性或方法 行: 48 字符: 3 代码: 0 URI: ... ...
- 将Excel中数据导入数据库(一)
在工作中经常要将Excel中数据导入数据库,这里介绍一种方法. 假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: Excel中数据导入数据库帮助类如下: using System; ...
- USACO Section 3.3 商店购物 Shopping Offers
题目背景 在商店中,每一种商品都有一个价格(用整数表示).例如,一朵花的价格是 2 zorkmids (z),而一个花瓶的价格是 5z .为了吸引更多的顾客,商店举行了促销活动. 题目描述 促销活动把 ...
- 图的最短路算法 Bellman-Ford
BF求图的最短路径的时间复杂度是O(MN),这样的时间复杂度并不比迪杰斯特拉算法好,但是BF算法支持图中存在负权的情况,但图中不能存在负圈,因为如果存在负圈,最短路是不存在的,因此BF算法的另一个重要 ...
- Android基础总结(10)——手机多媒体的运用:通知、短信、相机、视频播放
Android提供了一系列的API,是我们可以在程序中调用很多手机的多媒体资源,从而编写出更加丰富的应用程序. 1.通知的使用 通知(Notification)是Android中比较有特色的一个功能, ...
- Android基础总结(9)——网络技术
这里主要讲的是如何在手机端使用HTTP协议和服务器端进行网络交互,并对服务器返回的数据进行解析,这也是Android最常使用到的网络技术了. 1.WebView的用法 Android提供的WebVie ...
- vyatta的fork开源版本
https://www.reddit.com/r/networking/comments/3dvwfy/who_here_is_using_vyos/ Vyatta came in two flavo ...