易截截图软件、单文件、免安装、纯绿色、仅160KB

Delphi 类与对象内存结构浅析(上)


参考资料
李战.《悟透delphi》,第1章“DELPHI的原子世界”
 “探索Delphi类与对象的内存结构”
基本知识
动态内存与静态内存
当程序运行时,系统首先将所有数据装载入内存,完成初始化,然后从入口地址开始执行代码。
程序装载后即存在于内存空间中的数据我们称之为静态内存,运行过程中分配的内存我们称之为动态内存。
Delphi的类是由编译期间决定的,编译完成后即固定在程序中,所以类是存在于静态内存中(类信息应该是位于数据段,类的方法实现应该是位于代码段)。对象是由运行期间创建的,所以对象属于动态内存。
 
对象
DELPHI中的对象是一个指针,这个指针指向该对象在内存中所占据的一块空间。我们可以试着用sizeof函数获取对象的大小,结果是4字节,这正是一个32位指针的大小。而对象的真正大小应该用MyObject.InstanceSize获得。
 
对象空间
我们将对象指针指向的内存空间称为对象空间。对象空间的头4个字节是指向该对象直属类的虚方法地址表(VMT – Vritual Method Table)。接下来的空间就是存储对象本身成员数据的空间,并按从该对象最原始祖先类的数据成员到该对象具体类的数据成员的总顺序,和每一级类中定义数据成员的排列顺序存储。
当一个对象产生时,系统会为该对象分配一块内存空间,然后将空间的头4个字节存储为指向类的VMT的指针,从而将该对象与对象的直属类联系起来。即使类并未定义任何虚方法,对象仍然会保存指向虚方法地址表的指针,只是VMT地址项的长度为零。
 
类空间
我们将类指针指向的内存空间称为类空间。类指针与VMT指针地址相同。在TObject中定义的虚方法地址(如Destroy、FreeInstance等等)存储在相对VMT指针负方向偏移的空间中。在VMT的负方向偏移有76个字节的数据信息,它们是对象类的基本数据结构。而VMT是存储我们自己为类定义的虚方法地址的地方,它只是类数据结的构扩展部分。VMT前的76个字节的数据结构是DELPHI内定的,与编译器相关的,并且在将来的DELPHI版本中有可能被改变。
对我们的应用程序来说,类的数据是静态的数据。当编译器编译完成我们的应用程序之后,这些数据信息已经确定并已初始化。我们编写的程序语句可访问类数据中的相关信息,获得诸如对象的尺寸、类名或运行时刻的属性资料等等信息,或者调用虚方法以及读取方法的名称与地址等等操作。
 
VMT
每一个类都有对应的一个虚方法地址表(VMT – Vritual


相关文档:

delphi 对 RES文件的使用

一、引子:
     现在的Windows应用程序几乎都使用图标、图片、光标、声音等,我们称它们为资源(Resource)。最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便程序需要的时候调用。资源是程序的一部分,程序要正常运行就离不了资源文件。但是它是不可执行代码。
   &n ......

delphi实现调用dll中的窗体 代码

新建一个dLL工程,新建一个窗体 Fr_bb80 ,我们先在它的单元里加入下面一个函数:
function Report(Title:Pchar):Boolean  ;stdcall;
begin
   if Fr_bb80=nil then
   begin
         Fr_bb80:=TFr_bb80.Create(application);
   &nb ......

Windows API 的数据类型与 Delphi 数据类型对照表

Windows API 的数据类型与 Delphi 数据类型对照表
作者:admin 来源:未知 日期:2010-1-28 13:10:56 人气:43 标签:API
导读:WindowsAPI的数据类型与Delphi数据类型对照表
Windows 数据类型 
 Delphi 数据类型 
描述
LPSTR
PAnsiChar
字符串指针
LPCSTR
PAnsiChar
字符串指针
DWORD
LongWo ......

Delphi中建议使用的语句

Delphi中建议使用的语句
楼主zswang(伴水清清)(专家门诊清洁工)2002-05-15 13:37:54 在 Delphi / VCL组件开发及应用 提问
No.1   判断逻辑类型  
  var   B:   Boolean;  
  begin  
      B   :=   Boolean(2);   //这样只是为了调试//B ......

Delphi中窗体响应按键步骤

1.因为KeyPreview默认是 False;我们这里需要响应键盘事件的话,需要将其修改为True;
所以KeyPreview:=True; 这对一些快捷键会有用。
在窗体属性上修改KeyPreview := True;
2.在窗体的FormKeyDown函数里写:
if KeyPreview then
    Form将先响应键盘事件(在TEdit等控件之前)
else
    除非Fo ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号