`
美丽的小岛
  • 浏览: 309324 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

pascal学习小记(六)---VMT

 
阅读更多

今天看了《VCL》一章,感受很多,一般都学习JAVA的,对于面向对象用另外一个思维去解释的时候就显得有点不可以去适应了。

看了一下下午也只看了一个叫VMT的东西,虚拟方法表。明白了一个virtual与dynamic方法的区别。

相对来说,virtual占用的内存会很大比较多,每个子类都会把父类的的方法都列出来;对于dynamic就不会这样做的了,它只会把子类覆盖的放在VMT表中,其它的它会往上面找父类的方法。这个为VCL节省了很多内存。效率相对于virtual是相对慢了一点,可是节省了50%的空间,才拖延了3%的时间,很好的时间换空间的例子。



 内存的逻辑结构为:

 

 

 

实验代码:

unit fmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, ComCtrls, DB, DBTables, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    CheckBox1: TCheckBox;
    RadioButton1: TRadioButton;
    ListBox1: TListBox;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    Database1: TDatabase;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    lbVMTs: TListBox;
    lbVMTContents: TListBox;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Button4: TButton;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure RadioButton1Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Memo1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
    aClass : TClass;
    sClassName : String;

    procedure ShowVMTResult(const Msg: string);
    procedure ShowVMTEntry(const iDelta: Integer; pVMT: Pointer);
    procedure ShowVMTContent(aVMT: TClass);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  aClass := Self.Button1.ClassType;
  sClassName := 'TButton';
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  aClass := Self.CheckBox1.ClassType;
  sClassName := 'TCheckBox';
end;

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
  aClass := Self.RadioButton1.ClassType;
  sClassName := 'TRadioButton';
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  aClass := Self.ListBox1.ClassType;
  sClassName := 'TListBox';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  aClass := Self.ClassType;
  sClassName := 'TForm1';
end;

procedure TForm1.Memo1Click(Sender: TObject);
begin
  aClass := Self.Memo1.ClassType;
  sClassName := 'TMemo';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  aClass := Self.Database1.ClassType;
  sClassName := 'TDatabase';
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  ShowVMTContent(aClass);
end;

const
  VMTOFFSET = 12;
  VMTDELTA = 4;

procedure TForm1.ShowVMTContent(aVMT: TClass);
var
  pVMT : Pointer;
  idx : Integer;
begin
  ShowVMTResult(sClassName + ' VMT表格地址 : ' + IntToStr(Integer(aVMT)) );
  pVMT := Pointer(aVMT);
  idx := VMTOFFSET;
  while (idx > vmtSelfPtr) do
  begin
    ShowVMTEntry(idx, pVMT);
    Dec(idx, VMTDELTA);
  end;    // while
end;

procedure TForm1.ShowVMTEntry(const iDelta: Integer; pVMT: Pointer);
var
  pResult : Pointer;
  Msg : String;

  procedure DoProcess(const sName : String);
  begin
    if (Assigned(pResult)) then
    begin
      Msg := Format('%s : %x', [sName, Integer(pResult)]);
      ShowVMTResult(Msg);
    end;
  end;

begin
  pResult := Pointer(Integer(pVMT) + iDelta);
  case iDelta of    //
    vmtCreateObject : DoProcess('vmtCreateObject');
    vmtRelease : DoProcess('vmtRelease');
    vmtAddRef : DoProcess('vmtAddRef');
    vmtQueryInterface : DoProcess('vmtQueryInterface');
    vmtDestroy : DoProcess('vmtDestroy');
    vmtFreeInstance : DoProcess('vmtFreeInstance');
    vmtNewInstance : DoProcess('vmtNewInstance');
    vmtDefaultHandler : DoProcess('vmtDefaultHandler');
    vmtDispatch : DoProcess('vmtDispatch');
    vmtBeforeDestruction : DoProcess('vmtBeforeDestruction');
    vmtAfterConstruction : DoProcess('vmtAfterConstruction');
    vmtSafeCallException : DoProcess('vmtSafeCallException');
    vmtParent : DoProcess('vmtParent');
    vmtInstanceSize : DoProcess('vmtInstanceSize');
    vmtClassName : DoProcess('vmtClassName');
    vmtDynamicTable : DoProcess('vmtDynamicTable');
    vmtMethodTable : DoProcess('vmtMethodTable');
    vmtFieldTable : DoProcess('vmtFieldTable');
    vmtTypeInfo : DoProcess('vmtTypeInfo');
    vmtInitTable : DoProcess('vmtInitTable');
    vmtAutoTable : DoProcess('vmtAutoTable');
    vmtIntfTable : DoProcess('vmtIntfTable');
    vmtSelfPtr : DoProcess('vmtSelfPtr');
  end;    // case
end;

procedure TForm1.ShowVMTResult(const Msg: string);
begin
  Self.lbVMTs.Items.Add(Msg);
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  aPnl : TPanel;
  aForm : TForm1;
begin
  aClass := aPnl.ClassType;
  sClassName := 'TPanel';
  ShowVMTContent(aClass);

  aPnl := TPanel.Create(Self);
  aClass := aPnl.ClassType;
  sClassName := 'TPanel';
  ShowVMTContent(aClass);
  FreeAndNil(aPnl);


end;

procedure TForm1.Button5Click(Sender: TObject);
var
  Msg : String;
  pVMT : Pointer;
begin
  Msg := Format('%s : %x', ['Self', Integer(Pointer(Self))]);
  ShowVMTResult(Msg);
  pVMT := Pointer(Integer(Pointer(Self)^) + vmtSelfPtr);
  Msg := Format('%s : %x', ['vmtSelfPtr', Integer(Pointer(pVMT))]);
  ShowVMTResult(Msg);
  pVMT := Pointer(Pointer(Integer(Pointer(Self)^) + vmtSelfPtr)^);
  Msg := Format('%s : %x', ['vmtSelfPtr', Integer(Pointer(pVMT))]);
  ShowVMTResult(Msg);
end;

end.

 

显示实验为:



 

  • 大小: 1.2 MB
  • 大小: 458.9 KB
  • 大小: 73.3 KB
分享到:
评论

相关推荐

    exp-schp-201908270938-pascal-person-part.pth

    Self-Correction-Human-Parsing SCHP models exp-schp-201908270938-pascal-person-part.pth

    NWPU VHR-10的pascal voc格式

    NWPU VHR-10的pascal voc格式NWPU VHR-10的pascal voc格式NWPU VHR-10的pascal voc格式NWPU VHR-10的pascal voc格式NWPU VHR-10的pascal voc格式NWPU VHR-10的pascal voc格式NWPU VHR-10的pascal voc格式NWPU VHR-10...

    ffmpeg-delphi-pascal-headers-3.0.2.zip_FFVCL_delphi vlc_ffmpeg_f

    FFmpeg 是一个强大的开源多媒体处理框架,广泛应用于...总之,"ffmpeg-delphi-pascal-headers-3.0.2.zip" 提供了 Delphi 开发者使用 FFmpeg 的关键资源,通过深入学习和实践,开发者可以创建功能丰富的多媒体应用程序。

    Free Pascal 3.0.4 Windows 32-bit 绿色版

    Free Pascal 3.0.4 Windows 32-bit 绿色版,解压即用,方便快捷。 Free Pascal is a 32, 64 and 16 bit professional Pascal compiler. It can target many processor architectures: Intel x86 (including 8086), ...

    RemObjects Pascal Script for Delphi - 3.0.75.1117

    RemObjects Pascal Script for Delphi - 3.0.75.1117

    PASCAL-S.zip

    PASCAL-S数据集就是为了推动这一领域的研究而创建的。 PASCAL-S数据集全称为PASCAL Significant Objects Dataset,它是由PASCAL VOC(Visual Object Classes)数据集演变而来,但专注于显著性对象检测。PASCAL VOC...

    pascalscript-master(D3-XE10.2)

    通过深入学习和实践 PascalScript-D3-XE10.2,开发者不仅可以提升自己的 Delphi 技能,还能掌握跨平台脚本编程的能力,从而在多平台开发领域游刃有余。在这个过程中,不断地尝试、实验和优化,将是不断提升自己技术...

    pascal-5i数据集

    《Pascal-5i 数据集:开启小样本学习的探索之旅》 在人工智能领域,机器学习和深度学习的发展已经取得了显著的进步,然而,一个长期存在的挑战是“小样本学习”问题。在这种情况下,模型需要在有限的训练样本上学习...

    奥教案(PASCAL)-2019-11-19.pdf

    - **动态存储**:通过使用指针,Pascal 可以实现动态分配内存的功能,这对于处理不确定大小的数据结构非常有用。 #### 2. 函数和过程的作用 - **封装独立功能**:函数和过程可以将一组相关的操作封装起来,形成一个...

    Graphonomy Pascal-Person-Part trained model

    Graphonomy Pascal-Person-Part trained model, https://github.com/Gaoyiminggithub/Graphonomy

    DOS下的PASCAL编程工具--DOS开发工具

    DOSpascal.rar 很古老了,但很经典很实用,我为了学编程特意去买了个PPC...用来写PASCAL程序还是不错的,可以开发WIN32程序和DOS程序,当然你得有这个水平才行。刀是好刀,看你怎么用了。积分!积分!我要积分!^_^

    PASCAL语言培训教程-全国青少年信息学奥赛培训教程

    通过本教程的学习,学员将全面了解Pascal语言的基本概念和编程技巧,掌握从简单程序设计到高级算法的应用。这不仅有助于参赛者在全国青少年信息学奥林匹克竞赛中取得好成绩,也为其未来的编程学习和发展打下坚实的...

    pascal_person_part.zip

    Pascal-Person-Part:人体解析语义分割数据集,只有6种不同的语义标签,与人相关的也较粗糙,图像总数3553。

    Pascal N-IDE-Editor-Compiler-4.3.2.apk

    安卓上的免费Pascal语言编译器,也支持基本的面向对象功能(可以使用class),可以供大家玩玩。

    RemObjects PascalScript(D7-XE8)

    RemObjects PascalScript是一款高效且功能丰富的Pascal语言解释器,专为Delphi 7到XE8版本的开发者设计。这款工具允许程序员使用Pascal语法编写脚本代码,并在运行时环境中执行,极大地扩展了应用程序的功能和灵活性...

    Delphi历史版本详解-从-Turbo-Pascal-到-Delphi-XE-2

    Delphi历史版本详解-从-Turbo-Pascal-到-Delphi-XE-2

    RemObjects Pascal Script for Delphi - 3.0.51.881

    一款免费的用Delphi编写的脚本引擎,允许你在程序运行时使用Object Pascal语言,是一套能够编译到exe文件的单元,使用脚本引擎的好处:能够让你的程序让用户的自定义而不需要重新编译,你能够发布升级程序只需要发布...

    Pascal-S:Pascal 子集的 Pascal-S 编译器/解释器-开源

    这是苏黎世联邦理工学院 Niklaus Wirth 的原始 Pascal-S 项目。 它一步编译和解释 Pascal 语言的一个子集,并且只用了大约 2000 行。 您可以在 sourceforge 中找到所有 Pascal-P 版本:...

    js-leetcode题解之119-pascal's-triangle-II.js

    javascript js_leetcode题解之119-pascal's-triangle-II.js

    Pascal-5i数据集

    Pascal-5i数据集,里面还有20个类的图片

Global site tag (gtag.js) - Google Analytics