【问题标题】:How Delphi objects work in code [closed]Delphi 对象如何在代码中工作 [关闭]
【发布时间】:2010-08-23 03:50:28
【问题描述】:

我一直在查看 system.pas Delphi 最多可以从 Windows 调用 65,000 个内存块 当 Delphi 生成一个对象时,它会为它的数据调用一个内存块 如果是这样,该类是否会加载一个带有该内存块的内存地址的寄存器以及放置在另一个寄存器中的方法的地址。 有人知道吗?

J Lex Dean。


使用 GetMem,您可以从 windows 调用一个内存块,windows 在 4 gig 空间内为每个进程分配多达 65,000 个内存块。取决于 fag 取决于在调整大小时块是否移动,数据在调整大小或固定等问题中重新定位。 阅读有关 Windows 或访问 windows.pas 并搜索内存并调用您的 Delphi 帮助 他们在 system.pas like1/ _ObjectProcess 中有很多有趣的东西,好像给 delphi 程序员增加了困惑。为什么他们不只是将代码放在 TObject 中。 2/ 代码如何测量对象的错觉大小。

【问题讨论】:

  • 在没有给出理由(作为评论)的情况下投反对票是没有帮助的。
  • Lex,你为什么要为每个问题创建一个新帐户?如果 Stack Overflow 的某些方面您不了解如何使用,please ask

标签: delphi


【解决方案1】:

看看这个关于 Delphi 创建新 Class 实例时发生了什么的精彩解释:The Rise and Fall of TObject from Hallvard Vassbotn 尽管最初的文章出现在 1998 年,但大部分仍然适用于较新的 Delphi 版本。 以下是 The Delphi Magazine 的原文:The Delphi Magazine, July 1998

【讨论】:

    【解决方案2】:

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

    当一个类实例被创建时,在执行该类的Create方法之前调用下面的类方法(来自_ClassCreate全局函数,它保证实例只被创建一次,对于所有的Create嵌套调用) :

    class function TObject.NewInstance: TObject;
    

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

    class function TObject.InitInstance(Instance: Pointer): TObject;
    

    这个InitInstance 方法将:

    1. 调用FillChar()将之前分配的内存全部置0;
    2. 初始化对象的接口表。

    方法(即不是接口)是在类类型本身中定义的,而不是在类实例创建期间。

    没有包含您所说内容的“注册”。

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 2014-05-25
      • 2021-09-05
      相关资源
      最近更新 更多