Delphi对象如何在代码中工作

Delphi对象如何在代码中工作,delphi,Delphi,我一直在看system.pas Delphi可以从windows调用多达65000个内存块 当Delphi生成一个对象时,它会调用一个内存块来获取它的数据 如果是这样的话,类如何加载一个寄存器,其中包含该内存块的内存地址,以及另一个寄存器中放置的方法的地址。 有人知道这件事吗 莱克斯·迪恩 使用GetMem,您可以从windows调用内存块,windows在4G空间内为每个进程分配多达65000个内存块。根据fag的不同,这取决于调整块大小时是否移动块,以及在“调整大小”或“修复”和其他问题中

我一直在看system.pas Delphi可以从windows调用多达65000个内存块 当Delphi生成一个对象时,它会调用一个内存块来获取它的数据 如果是这样的话,类如何加载一个寄存器,其中包含该内存块的内存地址,以及另一个寄存器中放置的方法的地址。 有人知道这件事吗

莱克斯·迪恩


使用GetMem,您可以从windows调用内存块,windows在4G空间内为每个进程分配多达65000个内存块。根据fag的不同,这取决于调整块大小时是否移动块,以及在“调整大小”或“修复”和其他问题中重新定位的数据。 阅读有关Windows的信息,或转到Windows.pas并搜索内存,然后调用您的Delphi帮助 在system.pas中有很多有趣的事情,比如1/_ObjectProcess,似乎是为了给delphi程序员增加困惑。为什么他们不把代码放在TObject中呢。2/以及代码如何测量对象的尺寸

您的“65000内存块”统计数据来自哪里

创建类实例时,在执行该类的
Create
方法之前,将调用以下类方法(从
\u ClassCreate
全局函数,该函数确保只为所有Create嵌套调用创建一次实例):

调用
GetMem
从堆中获取内存,然后使用以下方法:

class function TObject.InitInstance(Instance: Pointer): TObject;
InitInstance
方法将:

  • 调用FillChar()将以前分配的所有内存都设置为0
  • 初始化对象的接口表
  • 方法(即不是接口)是在类类型本身中定义的,而不是在类实例创建期间定义的

    没有包含你所说内容的“登记簿”

    您可以通过对象的自变量或将其变量转换为指针来访问对象内存地址:

    var O: TObject;
    begin
      O := TObject.Create;
      writeln('O memory address is ',pointer(O));
      O.Free;
    end;
    

    在Delphi2010及其增强RTTI之前,您无法访问对象的所有方法和字段。代码只能访问已发布的属性和方法。但您必须使用RTTI。请参阅TypInfo.pas unit。

    看看这篇关于Delphi创建新类实例时发生了什么的精彩解释: 虽然最初的文章出现在1998年,但对于较新的Delphi版本,大部分内容仍然是正确的。
    以下是德尔福杂志的原始文章:

    没有给出理由(如评论)的否决投票是没有帮助的。莱克斯,你为什么要为每个问题创建一个新的帐户?如果堆栈溢出的某些方面您不了解如何使用。
    var O: TObject;
    begin
      O := TObject.Create;
      writeln('O memory address is ',pointer(O));
      O.Free;
    end;