gpt4 book ai didi

delphi - 如果一切都实现了一个接口(interface),这会是垃圾收集吗?

转载 作者:行者123 更新时间:2023-12-03 14:49:54 25 4
gpt4 key购买 nike

我还是个新手,我知道我的想法是错误的;我只是不知道在哪里 ...

Delphi 中的几乎所有内容都是 TObject 的后代。如果所有内容都源自实现了一些简单接口(interface)的 TInterfaceObject(例如,“INamable”,具有返回类名称字符串的单个方法),该怎么办?由于 TObject 已经具有返回名称字符串的属性,因此您无需向其他类添加任何内容。

换句话说,TInterfacedObject 将从 TObject(或层次结构中较高的东西)继承,并且当前从 TObject 派生的所有内容现在都将从这个新类派生。这是否意味着现在所有内容都已引用计数?

如果您能发现我的知识缺乏的地方,我很乐意学习。一如既往地感谢——Al C。

最佳答案

不清楚您是否在问:

  • Borland 最初开发 Delphi 时为什么不这样做?
  • 为什么 Embarcadero 在 Delphi 的 future 版本中不这样做?
  • 为什么我不使用自己的用户数据类型来执行此操作?

Wouldn't this mean everything was now reference counted?

是的,会的。

但是,您不一定希望所有内容都被引用计数:每个小整数,每个字符串,每个 bool 值,数组中的每个元素......如果没有其他原因,引用计数的实现会增加一些开销,例如每个对象需要一点额外的内存,对于大对象来说可能微不足道,但如果应用于每个小对象,则比例会更重要。

另请参阅Garbage Collector For Delphi Objects and Components其中说(引用),

Delphi 提供了三种对象管理方式:

  1. Create/destroy the objects using try..finally.
  2. Use TComponent descendants - create a component and let its owner free it.
  3. Interfaces - when the reference count for an interface becomes 0 the object which implements it is destroyed.

The Delphi help says you shouldn't mix the TComponent owner approach with the interface memory management, but ...

Would this be garbage collection?

不完全是;单纯的引用计数不如垃圾收集那么强大:

  • 使用引用计数,如果您有两个引用计数实例,每个实例都持有对另一个实例的引用,那么它们不会自动释放。要释放它们,您需要打破这种“循环引用”(即明确告诉其中一个释放对另一个的引用)。

  • 通过真正的垃圾收集,垃圾收集器会注意到这两个实例没有从其他任何地方引用,并释放它们。

更新
如果您将潜在的循环引用注释为 [weak] 引用,那么它们将被销毁。但在 Delphi 10.1 Berlin 之前,这仅适用于 NexGen 编译器(即在底层使用 LLVM 的编译器)。从 10.1 Berlin 开始,这些[weak] 引用在任何地方都有效。

关于delphi - 如果一切都实现了一个接口(interface),这会是垃圾收集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1436164/

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