【问题标题】:Reference counting without Garbage Collection没有垃圾收集的引用计数
【发布时间】:2012-07-15 19:51:21
【问题描述】:

我正在学习编程语言设计课程,其中一个主题是垃圾收集。我从材料中了解到,RC 可以用于 GC,但它也有其他用途,并且某些语言实现了 RC 而不是 GC。
如果不是 GC,RC 到底有什么用?

RC - 引用计数。GC - 垃圾回收)

【问题讨论】:

  • 需要注意的是,“垃圾收集”这个词并没有真正严格的具体含义。一个人的 GC 可能不会被视为另一个人的 GC。

标签: garbage-collection reference-counting


【解决方案1】:

可以使用引用计数,例如关闭未引用的文件句柄,或以某种方式“归档”当前未引用的数据(将来可能通过某些间接路径重新引用)。

【讨论】:

    【解决方案2】:

    我可以提供一个独立于垃圾收集使用的引用计数的具体示例。 Objective-C 使用引用计数来管理其对象的生命周期,在大多数情况下不存在垃圾收集器。

    这是通过在处理对象时平衡调用-retain-release 来完成的。基本上,创建一个对象时保留计数为 1,并且每个需要保留对对象的引用的对象在最初传递它时应将其保留计数增加 1,然后在完成时将保留计数减 1它。最后一个 -release 调用导致对象的保留计数降至 0(不再需要它)触发对象类型的内部机制以释放自身。

    执行此操作不需要垃圾收集器进程。事实上,直到最近,在 Apple 的平台上(到目前为止,它们是 Objective-C 的最大用户)上还没有垃圾收集器,甚至没有用于其 iOS 移动设备(现在在 Mac 上已弃用)桌面)。

    Objective-C 中的引用计数在本质上是默认手动的,要求开发人员遵循某些约定以确保安全地平衡保留和释放调用,以避免泄漏或过早释放。一个更新的系统刚刚在 LLVM 编译器中实现,它可以自动执行此操作,并在编译时添加适当的调用。这种自动引用计数消除了管理内存的大部分工作,同时消除了垃圾收集器进程扫描对象图的需要。

    垃圾收集器可以处理引用计数不能处理的一个特定条件是检测和删除保留周期。在循环中持有对该点的强引用的对象将永远不会在标准引用计数下被释放,即使所有引用循环中的对象的对象都释放了对其中对象的引用。垃圾收集器会发现这个循环并不植根于更大的对象图中,并且能够在执行扫描时移除整个循环。

    【讨论】:

    • 这不是垃圾回收吗?对象的自动删除/处置 GC!
    • @baruch - 不,引用计数仍然需要开发人员说明对象何时被保留和释放。不需要收集器进程来扫描内存并确定哪些对象不再被引用,对象在开发人员将最后一个版本传递给它的那一刻被释放(并不总是在正确的时间发送)。正如我所说,Objective-C 虽然引用计数,但同时具有垃圾收集和非垃圾收集实现(前者更受欢迎)。
    • 那是一种垃圾回收。不是全自动的,但仍然是 GC。 GC 不一定涉及“扫描”以查找未引用的项目。事实上,Java 风格的 GC 是一个相对较新的发明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2013-10-18
    • 2011-10-12
    相关资源
    最近更新 更多