代码之家  ›  专栏  ›  技术社区  ›  Al C

如果所有东西都实现了一个接口,这会是垃圾收集吗?

  •  7
  • Al C  · 技术社区  · 15 年前

    ...

    Delphi中几乎所有的东西都是TObject的后代。如果一切都是从一个实现了一些琐碎接口的TInterfaceObject派生出来的(例如,“INamable”,使用一个返回类名称字符串的方法),会怎么样?因为TObject已经有一个返回名称字符串的属性,所以不需要向其他类添加任何内容。

    如果你能发现我所缺乏的知识,我愿意学习。谢谢,一如既往,艾尔·C。

    5 回复  |  直到 15 年前
        1
  •  8
  •   Johan    9 年前

    不清楚你是否在问:

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

    这难道不意味着现在所有的东西都被计算在内了吗?

    是的。

    一切 待计数:数组中的每个小整数、每个字符串、每个布尔值、每个元素。。。如果没有其他原因,ref计数的实现增加了一些开销,例如,每个对象有一点额外的内存,对于大对象来说可能无关紧要,但是如果应用于每个小对象,则相应地更重要。

    Garbage Collector For Delphi Objects and Components 上面写着,

    1. 使用try..finally创建/销毁对象。
    2. 使用TComponent子体-创建一个组件并让其所有者释放它。
    3. 实现它的对象是 摧毁。

    德尔福的帮助说你不应该混在一起 使用

    这是垃圾收集吗?

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

    • 对于真正的垃圾回收,垃圾回收器会注意到这两个istance没有从其他任何地方引用,并将它们都释放。

    更新
    [weak] 引用,然后它们将被销毁。但在Delphi10.1之前,这只适用于NexGen编译器(即那些在后台使用LLVM的编译器)。从10.1柏林开始 [微弱] 参考文献随处可见。

        2
  •  5
  •   Mason Wheeler    15 年前

    因为接口使用了一个非常简单的引用计数系统,而循环引用(在Delphi代码中非常常见)打破了简单的引用计数,所以它不会进行垃圾收集。

        3
  •  3
  •   dummzeuch Stijn Sanders    15 年前

    不,因为两件事:

    1. 即使一个类实现了一个接口,它也不会自动将其引用计数。只有当您实际使用它来实现该接口时,引用计数才会产生任何效果。
    2. 正如其他人已经说过的:接口中的引用计数将导致在引用计数达到0时立即释放类实例。它是在代码中该点对Free方法的隐式调用。这将失败,例如,如果两个对象相互引用。真正的垃圾收集不会在对象超出范围时释放对象,而是在需要内存时释放对象,因此每次引用计数达到0时都不会对性能产生影响,因为对象将继续存在。此外,一个好的垃圾收集器将检测隔离的循环引用(例如,a引用B引用C引用a,但没有其他引用这些对象),并将释放这些对象。
        4
  •  2
  •   Kieveli    15 年前

    垃圾收集不同于简单的引用计数。当引用计数达到0时,可以自动删除,但这也不是垃圾收集。垃圾收集意味着放弃控制何时从内存中删除内容的能力,并允许底层语言的实现优化行为。您不再关注引用计数,而是信任垃圾收集的特定实现的动态行为。

    当然,垃圾收集使用一个引用计数系统来知道什么时候不再引用某些内容,但这只是其中的一小部分。

        5
  •  1
  •   SeanX    15 年前

    引用计数是垃圾收集的一种形式,但不是一种很好的形式。它被一些语言(我想是python)使用,尽管经常与循环检测一起使用。

    Var 
      nameable: IMyInterface;
    begin
      nameable:= IMyInterface.Create();
      nameable.x(y);
      etc
    end;
    

    这意味着您的接口需要已经支持您所需要的方法和属性,这很快就会变得单调乏味,因为您需要为每个类创建接口。

    但在D2009或更高版本中可以相当容易地完成。参见巴里·凯利的《实施 smart pointers . 不过,通常的参考计数空穴也适用。