转 探索Delphi类与对象的内存结构

本文探讨了Delphi中类和对象的内存结构,包括动态内存与静态内存的区别,类的内存结构如虚方法表、动态方法表、接口表等,以及对象的内存结构创建过程和基本内存结构分析。
摘要由CSDN通过智能技术生成

初次接触DELPHI对它提供的RAD快速编程模式颇感神奇,随手拖放及格控件设定些属性一个应用程序就诞生了,我正是被这种特性所吸引。随着深入,慢慢的窥探到了DELPHIVCL体系,知道了随手拖放背后隐藏的秘密:一切都起源于VCL的对象体系,一切都是面对对象的编程思想。Object pascal就是是怎样实现这个体系的呢,它究竟是如何将面对对象的特性表现出来的呢,Delphi的类和对象究竟是以什么样的形式存在的呢。带着这些问题我翻阅了一些书籍,也借鉴了一些网友的成果,做了下面的探索。

动态内存与静态内存

程序需要执行必须先装载入内存,任何程序表现的数据都存在内存中。当程序运行时,系统首先将所有数据装载入内存,完成初始化,然后从入口地址开始执行代码。程序装载后即存在于内存空间中的数据我们称之为静态内存,运行过程中分配的内存我们称之为动态内存。Delphi的类是由编译期间决定的,编译完成后即固定在程序中,所以类是存在于静态内存中。对象是由运行期间创建的,所以对象属于动态内存。

注意:后面所提到的TObject均为泛指所有类,而非真正的TObject

                                                        程序运行示意图

类的内存结构

       类的内存结构是固定的,编译完成后就无法改变。它主要存储了类的基本信息,派生对象内存大小,虚方法列表,动态方法列表,公开属性和方法列表(published),接口列表,TObject类的一些方法等等有关于构建对象所必须的信息。这些信息的存储位置在SYSTEM单元中有定义:

  vmtSelfPtr           = -76;         指向虚方法表的指针

  vmtIntfTable         = -72;          指向接口表的指针

  vmtAutoTable         = -68;        指向自动化信息表的指针

  vmtInitTable         = -64;          指向实例初始化表的指针

  vmtTypeInfo          = -60;        指向类型信息表的指针,这里的数据对于RTTI来说非常重要,它指向一个PTypeInfo类型的指针,有兴趣可以看看TypInfo单元

  vmtFieldTable        = -56;          指向域定义表的指针(我开始认为是Published Field,但实际查询时却为NIL

  vmtMethodTable       = -52;        指向方法定义表的指针(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值