gpt4 book ai didi

delphi - 在 Delphi 中使用旧式 `object` 而不是 `class` 有好处吗?

转载 作者:行者123 更新时间:2023-12-03 14:40:47 24 4
gpt4 key购买 nike

在德尔福 理智 人们使用 class来定义对象。
在 Windows 版 Turbo Pascal 中,我们使用了 object今天你仍然可以使用 object创建一个对象。

不同之处在于object生活在堆栈上,还有一个 class住在堆上。
当然还有 object被贬值了。

抛开这一切:

使用 object 有什么好处吗?而不是类?

我知道object在 Delphi 2009 中已损坏,但我有一个特殊用例 1),其中速度很重要,我正在尝试查找是否使用 object会让我的事情更快,而不会让它变得有问题
此代码库在 Delphi 7 中,但我可能会将其移植到 Delphi 2007,尚未决定。

1)康威的人生游戏

长评论
感谢大家为我指出正确的方向。

让我再解释一下。我正在尝试更快地实现 hashlife , see also herehere for simple sourcecode

目前的记录保持者是 golly ,但是 golly 使用了 Bill Gospher 原始 lisp 代码的直接翻译(作为一种算法非常出色,但根本没有在微观层面进行优化)。 Hashlife 使您能够在 O(log(n)) 时间内计算一代。

它通过使用空间/时间权衡来做到这一点。出于这个原因,hashlife 需要大量内存,千兆字节并非闻所未闻。作为返回,您可以使用第 2^127 代 (17014118346046923173168730370000)000000) 计算第 2^128 代 (340282366920938463463374607431770000000)。

因为 hashlife 需要为以更大模式出现的所有子模式计算哈希,所以对象的分配需要快速。

这是我确定的解决方案:

分配优化
我分配了一大块物理内存(用户可设置),比如说 512MB。在这个 blob 中,我分配了我所说的 奶酪堆 .这是一个普通的堆栈,我在其中推送和弹出,但弹出也可以来自堆栈的中间。如果发生这种情况,我会将其标记在 free 上列表(这是一个普通的堆栈)。插入时,我检查了 free如果没有任何东西是免费的,我会像往常一样推送。我将按照建议使用记录,它看起来像是开销最少的解决方案。

由于 hashlife 的工作方式,很少 pop发生 ping 和很多 push es.我为不同大小的结构保留单独的堆栈,确保在 4/8/16 字节边界上保持内存访问对齐。

其他优化

  • 递归删除
  • 缓存优化
  • 使用 inline
  • 哈希的预先计算(类似于彩虹表)
  • 病理病例检测和回退算法的使用
  • GPU的使用
  • 最佳答案

    要使用正常的 OOP 编程,您 应始终使用 class种类 .您将拥有 Delphi 中最强大的对象模型,包括接口(interface)和泛型(在更高的 Delphi 版本中)。

    1.记录、指针和对象

    记录可能是邪恶的(如果您忘记将参数声明为 const ,则记录隐藏缓慢,记录隐藏的缓慢清理代码,fillchar 会使记录中的任何字符串成为内存泄漏...),但它们有时非常通过指针方便地访问二进制结构(例如一些“小值”)。

    一个动态的小记录数组(例如一个整数和一个 double 字段)将是 TList 快小类授课;与 our TDynArray wrapper ,您将拥有对记录的高级访问权限,包括序列化、排序、散列等。

    如果使用指针,您必须知道自己在做什么。坚持使用类绝对更可取,而且 TPersistent如果您想使用神奇的“VCL 组件所有权模型”。

    记录不允许继承。您要么需要使用“变体记录”(在其类型定义中使用 case 关键字),要么使用嵌套记录。使用类 C API 时,有时必须使用面向对象的结构。恕我直言,使用嵌套记录或变体记录远不如旧的“对象”继承模型清晰。

    2. 何时使用对象

    但是在某些地方,对象是访问现有数据的好方法。

    甚至对象模型也比新的记录模型更好,因为它处理简单的继承。

    a Blog entry last summer ,我发布了一些仍然使用对象的可能性:

  • 一个内存映射文件,我想快速解析它:指向这样一个对象的指针很棒,而且你手头还有方法;我将它用于在 SynZip.pas 中映射 .zip header 的 TFileHeader 或 TFileInfo;
  • 一个 Win32 结构,由 API 调用定义,我在其中放置了方便的方法以方便访问数据(为此,您可以使用记录,但如果结构中有一些面向对象 - 这很常见 - 您将有嵌套记录,这不是很方便);
  • 在堆栈上定义的临时结构,仅在过程中使用:我将其用于 SynZip.pas 中的 TZStream,或用于我们的 RTTI 相关类,它们以面向对象的方式映射 Delphi 生成的 RTTI,而不是作为函数的 TypeInfo/面向过程。通过直接映射 RTTI 内存内容,我们的代码比使用在堆上创建的新 RTTI 类更快。我们不实例化任何内存,对于像我们这样的 ORM 框架来说,它的速度有好处。我们需要大量的 RTTI 信息,但我们需要快速、直接需要。

  • 3.现代Delphi中对象实现是如何被破坏的

    恕我直言,现代Delphi中对象损坏的事实是一种耻辱。

    通常,如果您在堆栈上定义一个记录,其中包含一些引用计数变量(如字符串),它将在方法/函数的开始级别由一些编译器魔术代码初始化:
    type TObj = object Int: integer; Str: string; end;
    procedure Test;
    var O: TObj
    begin // here, an _InitializeRecord(@O,TypeInfo(TObj)) call is made
    O.Str := 'test';
    (...)
    end; // here, a _FinalizeRecord(@O,TypeInfo(TObj)) call is made

    那些 _InitializeRecord_FinalizeRecord将“准备”然后“释放” O.Str 变量。

    在 Delphi 2010 中,我发现有时候,这个 _InitializeRecord() 并不总是被制作出来。
    如果记录只有一些没有公共(public)字段,隐藏调用有时不会由编译器生成。

    只需再次构建源代码,就会有...

    我发现的唯一解决方案是使用 record 关键字而不是 object。

    因此,生成的代码如下所示:
    /// used to store and retrieve Words in a sorted array
    // - is defined either as an object either as a record, due to a bug
    // in Delphi 2010 compiler (at least): this structure is not initialized
    // if defined as a record on the stack, but will be as an object
    TSortedWordArray = {$ifdef UNICODE}record{$else}object{$endif}
    public
    Values: TWordDynArray;
    Count: integer;
    /// add a value into the sorted array
    // - return the index of the new inserted value into the Values[] array
    // - return -(foundindex+1) if this value is already in the Values[] array
    function Add(aValue: Word): PtrInt;
    /// return the index if the supplied value in the Values[] array
    // - return -1 if not found
    function IndexOf(aValue: Word): PtrInt; {$ifdef HASINLINE}inline;{$endif}
    end;
    {$ifdef UNICODE}record{$else}object{$endif}太糟糕了......但是代码生成错误没有发生,因为......

    由此产生的源代码修改并不大,但有点令人失望。我发现旧版本的 IDE(例如 Delphi 6/7)无法解析此类声明,因此类层次结构将在编辑器中被破坏... :(

    向后兼容性应包括回归测试。由于现有代码,许多 Delphi 用户留在该产品上。破坏功能对于 Delphi 的 future 来说非常成问题,恕我直言:如果您必须重写大量代码,那么您不应该将项目切换到 C# 或 Java 吗?

    关于delphi - 在 Delphi 中使用旧式 `object` 而不是 `class` 有好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6103747/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com