【发布时间】:2011-10-22 01:28:09
【问题描述】:
什么情况下垃圾回收比手动内存管理更高效? (这里的手册可能意味着使用 C 中的 malloc 和 free,或者 C++ 普及的更清洁的 RAII 和智能指针技术)
我喜欢垃圾收集如何消除编写软件时的一些意外复杂性,但我更高兴的是 RAII 和智能指针如何消除这种复杂性,同时还能处理内存以外的资源,具有确定性,并提供性能保证和整体效率更高。所以我想我可以放心地忽略垃圾收集。但是,我注意到人们一直在说垃圾收集比 C++ 中使用的严格资源管理更快,例如在有大量额外内存可用时。
那么垃圾回收究竟什么时候可以胜过手动内存管理呢?我喜欢 RAII 和智能指针,但如果它更快,我很乐意接受垃圾收集作为另一种工具。
【问题讨论】:
-
垃圾收集速度更快的时候是什么都不需要释放。如果您的程序不使用大量内存资源,垃圾收集器可能永远不需要启动。GC 系统中的分配器可能就像移动指针一样简单。
-
GC 性能高度依赖于所选择的算法。 “手动”内存管理器也是如此。我们最多只能将苹果与橙子进行比较。
-
@Michael Burr:在这种情况下,手动管理可能同样便宜。您实质上是在描述批量解除分配的情况,并且程序在整批分配被解除分配之前终止。这对于 GC 和 malloc/free 实现都是可能的。
-
老实说,我认为您问错了问题。更好的问题是,“GC 是否达到或超过了我的应用程序的性能预算以及 GC 带来了哪些优势?”
-
@MSalters:如果所有分配/解除分配代码都在您的控制之下,这是正确的,但是如果您使用库代码(无论是您自己的还是其他人的)或使用 RAII,您通常会失去对一定程度上的释放政策。无论如何,我将其放在评论中,因为我认为这并不是一个重要的性能考虑因素。它可能会在较小的程序/实用程序中以某种理论上的方式发挥作用,但我认为在这些情况下它不会成为任何真正的“胜利”。
标签: c++ garbage-collection raii