我正在参加关于编译器的大学课程,我们刚刚讨论了
垃圾收集和释放内存的
方法.然而,在课堂讲座和我们的教科书中,我被引导相信引用计数不是管理记忆的好
方法.
原因是引用计数非常昂贵,因为程序必须插入许多附加指令来递增和递减引用计数.此外,每次引用计数更改时,程序必须检查它是否等于零,如果是,则回收内存.
我的教科书甚至还有一句话:“总的来说,引用计数的问题超出了它的优点,很少用于编程语言环境中的自动存储管理.
我的问题是:这些合法性问题是否存在? Objective-c是否以某种方式避免它们?如果是这样的话?
引用计数确实有有意义的开销,这是真的.然而,跟踪
垃圾收集器的“经典教科书”
解决方案也并非没有缺点.最大的一个是非确定性,但暂停与吞吐量相关也是一个重要问题.
最后,ObjC并没有真正做出选择.最先进的复制收集器需要ObjC没有的语言的某些属性(例如没有原始指针).因此,尝试将教科书解决方案应用于ObjC最终需要一个部分保守的非复制收集器,这实际上与引用计数的速度大致相同但没有确定性行为.
(编辑)我的个人感受是吞吐量是次要的,甚至是第三级的,并且真正重要的争论归结为确定性行为与循环收集和通过复制的堆压缩.所有这三个都是如此有价值的属性,我很难选择一个.