Mark And Sweep更快(对整体性能的影响较小),但它患有“冻结世界”综合症:即当GC开始时,所有其他事情都将停止,直到GC完成清理。如果您希望构建一个在几毫秒内响应的服务器……有些交易不会达到你的期望:)
Reference Counting的问题是不同的:引用计数会增加开销,特别是在多线程环境中,因为你需要原子计数。此外,还有参考循环的问题,所以你需要一个聪明的算法来检测这些循环并消除它们(通常也通过“冻结世界”来实现,尽管不太常见)。一般来说,到今天为止,这种类型(即使通常反应更灵敏,或者更确切地说,冻结更少)比Mark And Sweep慢。
我看过一篇Eiffel实现者的论文,他们试图实现一个Reference Counting垃圾收集器,它将具有与Mark And Sweep类似的全局性能,但没有“冻结世界”方面。它需要一个单独的GC线程(典型的)。算法(在最后)有点吓人,但论文很好地一次介绍了一个概念,并展示了算法从“简单”版本到成熟版本的演变。推荐阅读,如果我能把我的手放回PDF文件…
< p >简短的回答:
我们不知道如何有效地(在很小的时间和空间开销下)并在所有可能的情况下(在所有可能的情况下)正确地进行垃圾收集
< p >长答:
就像C一样,c++是一种系统语言;这意味着当您编写系统代码时,例如操作系统时,将使用它。换句话说,c++的设计就像C一样,以最好的性能作为主要目标。语言标准不会增加任何可能阻碍性能目标的特性