DELPHI类与对象内存结构浅析.pdf

  1. 1、本文档共41页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DELPHI类与对象内存结构浅析

基本知识 动态内存与静态内存 当程序运行时,系统首先将所有数据装载入内存,完成初始化,然后从入口地址开始执行 代码。 程序装载后即存在于内存空间中的数据我们称之为静态内存,运行过程中分配的内存我们 称之为动态内存。 Delphi 的类是由编译期间决定的,编译完成后即固定在程序中,所以类是存在于静态内存 中 (类信息应该是位于数据段,类的方法实现应该是位于代码段)。对象是由运行期间创建 的,所以对象属于动态内存。 对象 DELPHI 中的对象是一个指针,这个指针指向该对象在内存中所占据的一块空间。我们可 以试着用sizeof 函数获取对象的大小,结果是4字节,这正是一个32位指针的大小。而对象的 真正大小应该用MyObject.InstanceSize获得。 对象空间 我们将对象指针指向的内存空间称为对象空间。对象空间的头4个字节是指向该对象直属 类的虚方法地址表 (VMT –VritualMethod Table)。接下来的空间就是存储对象本身成员数据 的空间,并按从该对象最原始祖先类的数据成员到该对象具体类的数据成员的总顺序,和每一 级类中定义数据成员的排列顺序存储。 当一个对象产生时,系统会为该对象分配一块内存空间,然后将空间的头4个字节存储为 指向类的VMT 的指针,从而将该对象与对象的直属类联系起来。即使类并未定义任何虚方 法,对象仍然会保存指向虚方法地址表的指针,只是VMT地址项的长度为零。 类空间 我们将类指针指向的内存空间称为类空间。类指针与VMT指针地址相同。在TObject 中定 义的虚方法地址 (如Destroy、FreeInstance等等)存储在相对VMT指针负方向偏移的空间中。 在VMT 的负方向偏移有76个字节的数据信息,它们是对象类的基本数据结构。而VMT是存 储我们自己为类定义的虚方法地址的地方,它只是类数据结的构扩展部分。VMT前的76个字 节的数据结构是DELPHI 内定的,与编译器相关的,并且在将来的DELPHI版本中有可能被改 变。 对我们的应用程序来说,类的数据是静态的数据。当编译器编译完成我们的应用程序之 后,这些数据信息已经确定并已初始化。我们编写的程序语句可访问类数据中的相关信息,获 得诸如对象的尺寸、类名或运行时刻的属性资料等等信息,或者调用虚方法以及读取方法的名 称与地址等等操作。 VMT 每一个类都有对应的一个虚方法地址表 (VMT –VritualMethodTable),类的VMT保存 从该类的原始祖先类派生到该类的所有类的虚方法的过程地址。虚拟方法表包括本身以及以上 的父类所有的虚拟方法的地址,调用时直接指向地址即可,好处在于速度极快,不需要查询, 缺点在于占用了额外的内存。 DMT 每一个类都有对应的一个动态方法地址表 (DMT –DynamicMethodTable),类的DMT 只保存类本身所包含的动态方法的过程地址,如果调用者的动态方法不属于自己,则根据索引 号往上级父类遍历查询得到方法的地址,好处在于不用保存父类的动态方法从而节省了内存, 缺点在于搜索带来的效率下降。 类的类型 在DELPHI 中我们用TObject、TComponent等等标识符表示类,它们在DELPHI 的内部实 现为各自的VMT数据。而用classof保留字定义的类的类型,实际就是指向相关VMT数据的 指针。 TClass 在System.pas单元中,TClass是这样定义的: TClass classofTObject; 它的意思是说,TClass是TObject 的类。从概念上说,TClass是TObject类的类型。但是, 我们知道DELPHI 的一个类代表着一个VMT数据项。因此,TClass可以认为是为VMT数据项 定义的类型,实际上它就是一个指向VMT数据的指针类型! 有了类的类型,我们就可以将类赋值给使用 “类的类型”声明的变量 (即类变量),从而 将类作为变量来使用。可以将类变量理解为一种特殊的对象,你可以象访问对象那样访问类变 量的方法。 类方法 类方法,就是指在类的层次上调用的方法,它是用保留字class声明的方法。 在类方法中你也可使用self这一标识符,不过其所代表的含义与对象方法中的self是不同 的。类方法中的self表示的是自身的类,即指向VMT 的指针,而对象方法中的self表示的是对 象本身,即指向对象数据空间的指针。 虽然,类方法只能在类层次上使用,但你仍可通过一个对象去调用类方法。例如,可以通 过

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档