【问题标题】:Delphi automatic garbage collectorDelphi 自动垃圾收集器
【发布时间】:2010-10-21 14:48:07
【问题描述】:

是否有可能考虑在未来在 Delphi 中拥有一个自动垃圾收集器?在许多应用程序中,对何时释放对象的高度详细控制并不那么重要,它只是额外需要关心的事情。

对于这样的应用程序,拥有一种像 java 那样工作的垃圾收集器会很有趣。

可以在项目选项中设置。

这可能吗?

注意:我不是说像here 解释的那样手动创建它,我真正的意思是 Delphi 功能。

换一种说法:是否可以将 FastMM 设置为垃圾收集器?

【问题讨论】:

  • 懒惰的程序员? ;-) 恕我直言 Delphi 不应该模仿所有流行的语言。它应该设定自己的目标并以此为目标。恕我直言,GC 不是 Delphi 需要的。恕我直言,拥有可以从 GCed 或不被 GC 切换的语言也可能会打开潘多拉的盒子。调试模式下的 FastMM 将在应用程序退出时收集几乎所有垃圾并告诉您修复... :-)

标签: delphi garbage-collection fastmm


【解决方案1】:

在许多应用程序中,对何时释放对象的高度详细控制并不那么重要,它只是额外需要关心的事情。

我相信几乎没有这样的应用程序。大多数时候,您认为不需要控制对象何时被销毁,这可能是在引入错误。

现在,确实存在某些 对象可以安全地忽略以稍后由自动收集器处理的情况。但请记住,对于您计划不手动销毁的 每个 对象,您需要仔细考虑这一点。如果它持有一些锁怎么办?如果它打开了一些文件,可能处于拒绝共享模式怎么办?

将您从销毁每个对象的想法中解放出来并没有太大的好处,当安全编程时您仍然需要考虑销毁每个对象。

垃圾收集器的目的不是让程序员免于看到这些东西。这是为了节省一点引用计数和 try/finally 调用。

【讨论】:

  • 是的,但那说有一个垃圾收集器作为一个选项并不是一件坏事。
【解决方案2】:

Garbage collection is possible in C and C++,所以我看不出为什么 Delphi 不能也有这样的功能。如果您交叉手指并等待足够长的时间,Delphi 可能会进行垃圾收集。不过,我不认为这是 Embarcadero 的优先事项。

您不能将 FastMM 设置为垃圾收集器,因为 FastMM 不进行垃圾收集,因此无需设置任何内容。 Delphi 假设的未来垃圾回收功能可能需要与内存管理器合作,所以如果这样的功能曾经存在,并且当时 FastMM 仍然是内存管理器,那么 FastMM 可能会获得一些设置。

【讨论】:

    【解决方案3】:

    垃圾收集既有优点也有缺点,即使没有 GC(垃圾收集器),delphi 也很好。即使是delphi应用程序占用的内存也比托管.net应用程序少,有时垃圾收集也会减慢进程,因为它必须找到不需要的资源,确认是否再次需要它们并删除它。如果再次需要它必须再次加载(应用程序变慢)或出现错误,因此 delphi 很好,无需手动释放 GC,这对专业程序员来说是件好事

    【讨论】:

    • 是的,我首先担心的是,在 delphi 中,要键入很多内容,例如“begin”而不是“{”,直到释放对象。当然,释放对象可以让您完全控制并迫使您更多地考虑对象的寿命。然后,无论如何,我认为开发人员在实际输入新代码行上花费的时间不会超过 5%,所以这不是一个真正的问题。
    • 是的,你在输入 begin 时浪费了一点时间(代码完成对你有很多次),并且在阅读代码时获得了很多时间,因为发现 begin/end 块比 { /} 个
    • 我输入 beginend 比那些可怕的 {} 要快得多,因为你需要 shift 和 [] 键。
    • 好吧,从好的方面来说,虽然需要输入更多内容,但要调试的内容却少了很多 :-)
    【解决方案4】:

    随 RTTI 提供的 delphi 的持久版本(这也是应用程序规模庞大的一个原因) 我认为 rtti(运行时类型信息)将来可以帮助我们。因为它包含有关正在进行的过程的一些信息,所以我认为将来可能会出现一些类似的功能,例如垃圾收集器,但不确定

    【讨论】:

    【解决方案5】:

    但用于 dot net 2007 和其他旧的 delphi dot net 的 delphi 有垃圾收集器 + vcl 但现在已弃用(垃圾收集器也不能 100% 正常工作)

    【讨论】:

    • 你是说 .NET GC 不能 100% 正常工作吗? Delphi.NET输出CLR代码,GC是.NET GC,不是Delphi.NET自己的GC。
    • 嘿,delphi vcls 有一些内存泄漏,甚至无法被 .net 的 gc 识别。 delphi for dot net(d2007 和 oldies )只是一个 .net 包装的 vcl,所以你不能期望超过 vcl
    猜你喜欢
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2011-11-07
    • 2013-04-01
    相关资源
    最近更新 更多