2

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

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

4

2 回答 2

3

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

于 2012-07-15T19:58:55.540 回答
2

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

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

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

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

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

于 2012-07-15T22:08:27.387 回答