Objective c LLVM 3中重新定义的垃圾收集?

Objective c LLVM 3中重新定义的垃圾收集?,objective-c,garbage-collection,llvm,Objective C,Garbage Collection,Llvm,我读到过这样一个事实,LLVMV3使用对代码的静态分析来实现一种自动垃圾收集,它是在编译过程中准备和完成的 如果编译器静态地插入、保留和释放,那么就不再需要用于垃圾收集的运行时组件,或者什么 这是真的吗?在iOS和OSX开发中,它会取代常规的垃圾收集吗?不清楚会发生什么事 我们应该依赖这种“静态垃圾收集”吗?这是一个有趣的问题:静态分析器能否实现一个完整的垃圾收集系统 答案似乎是否定的。实现垃圾收集的唯一方法是知道分配的内存(例如对象实例)不再可用。在运行时GC中,通过(有效地)扫描堆栈和堆来获

我读到过这样一个事实,LLVMV3使用对代码的静态分析来实现一种自动垃圾收集,它是在编译过程中准备和完成的

如果编译器静态地插入、保留和释放,那么就不再需要用于垃圾收集的运行时组件,或者什么

这是真的吗?在iOS和OSX开发中,它会取代常规的垃圾收集吗?不清楚会发生什么事


我们应该依赖这种“静态垃圾收集”吗?

这是一个有趣的问题:静态分析器能否实现一个完整的垃圾收集系统

答案似乎是否定的。实现垃圾收集的唯一方法是知道分配的内存(例如对象实例)不再可用。在运行时GC中,通过(有效地)扫描堆栈和堆来获得这些知识。在编译时执行此操作需要分析系统中所有可能的代码路径,以确定在执行过程中无法再访问特定分配的位置。这相当于停顿问题。然而,LLVM声称至少为您支持一种有限形式的自动引用计数(插入保留/释放)。看见我怀疑LLVM所做的并不是一个完整的GC,它使用静态分析器来查找对象的所有引用何时超出范围,并为您插入适当的retain/RELEASE。引用计数发生在运行时,与以前一样。我非常怀疑它是否能为您自动
免费
-ing malloc'd块


如果它能像上面公共网站上的广告那样工作,我会说使用它。

你所听到的是正确的。请参阅第页的“自动参考计数”。如果您是一名注册开发人员,您可以在最近发布的“最新信息”文档(NDA下)中阅读更多关于ARC的信息

如果编译器静态地插入、保留和释放,那么就不再需要用于垃圾收集的运行时组件,或者什么

ARC代表“自动参考计数”,因此通常采用参考计数(RC)。RC是最古老的垃圾收集形式之一,可以追溯到1960年,在实践中很少使用,因为它速度非常慢,会导致无限的暂停,并且由于泄漏周期而不准确


RC的速度很慢,因为每次处理对对象的引用时(例如,从堆中读取引用或将引用写入堆中),引用计数都会递增或递减,线程安全引用计数必须使用原子递增和递减操作调整计数。原始引用计数(例如C++中的
shared_ptr
)比跟踪垃圾收集慢约10倍。ARC使用静态分析来删除一些计数器增量和减量,这将提高性能,但我不知道有任何基准测试,我严重怀疑与JVM或CLR相比,结果是否具有竞争力(这两家公司很久以前就放弃了引用计数,因为他们发现跟踪垃圾收集速度更快、更准确).

这当然是可能的,至少部分是可能的;请看,虽然这是因为被问到时关闭的,但我的回答谈到了LLVM 3.0中的ARC与垃圾收集之间的区别。另请参阅Chris Lattner关于该主题的信息。