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

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

对象空间
内存结构
对象的内存结构是固定的,对象创建完成后就无法改变。它主要存储了对象直属类的地址(等价于类的VMT),对象本身的成员数据,对象的接口方法表地址。结构如图所示:
说明:若类未声明接口,则对象空间不存储接口方法表地址。
 
类空间与对象空间的关系
类空间与对象空间:
示例:分析对象的基本内存结构
代码:
type
    IMyInterface = interface(IUnknown)
        ['{06F3EA2C-E9C2-410E-97BE-D88ADF775EC3}']
        procedure InterfaceMethod1;
    end;
    TMyObject = class(TInterfacedObject,IMyInterface)
    private
        FField1: Integer;
        FField2: Boolean;
    protected
        procedure InterfaceMethod1;
    public
        procedure DynamicMethod1; dynamic;
        procedure DynamicMethod2; dynamic;
        procedure VirtualMethod1; virtual;
        procedure VirtualMethod2; virtual;
    end;
    TMyObject2 = class(TMyObject)
    private
        FField3: Integer;
    public
        procedure DynamicMethod1; override;
        procedure VirtualMethod1; override;
    end;
 
内存结构:
TInterfacedObject内存结构如图:
TMyObject内存结构如图:
 
TmyObject2内存结构如图:
 
 
如图,TMyObject2的VirtualMethod1方法覆盖了父类的VirtualMethod1方法,故虚方法表中VirtualMethod1的指针指向了TMyObject2的VirtualMethod1方法。TMyObject2的DynamicMethod1方法覆盖了父类的DynamicMethod1方法,由于动态方法表只保存当前类的动态方法表,故表中只有一个DynamicM


相关文档:

DELPHI 查找,增加,修改,删除

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button ......

DELPHI用FindWindow、FindWindowEx 查找窗口

FindWindow(
lpClassName, {窗口的类名}
lpWindowName: PChar {窗口的标题}
): HWND; {返回窗口的句柄; 失败返回 0}
//FindWindowEx 比 FindWindow 多出两个句柄参数:
FindWindowEx(
Parent: HWND; {要查找子窗口的父窗口句柄}
Child: HWND; {子窗口句柄}
ClassName: PChar ......

DELPHI GetClassName 获取指定窗口的类名

//声明:
GetClassName(
hWnd: HWND; {指定窗口句柄}
lpClassName: PChar; {缓冲区}
nMaxCount: Integer {缓冲区大小}
): Integer; {返回类名大小; 失败返回 0}
//测试1: 新建一个工程, 主窗口的类名默认是 TForm1, 用程序获取一下看看
var
ps: array[0..254] of Char;
begin
GetCl ......

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


参考资料
李战.《悟透delphi》,第1章“DELPHI的原子世界”
 “探索Delphi类与对象的内存结构”
基本知识
动态内存与静态内存
当程序运行时,系统首先将所有数据装载入内存,完成初始化,然后从入口地址开始执行代码。
程序装载后即存在于内存空间中的数据我们称之为静态内存,运行过程中 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号