可能是重复的问题:
C++中的垃圾收集 - 为什么使用?
你好,我读了一些关于垃圾回收器的文章,但有一件事我仍然不明白 - 为什么要使用垃圾回收?
我来尝试解释一下我的想法:
垃圾回收器应该会在没有需要时释放动态分配的内存,对吧?那么,如果你用 C 语言编写程序,你知道是否需要某个内存块,如果不需要,就可以直接销毁它。
那么,既然只需要明智地管理内存分配和释放,为什么还要使用垃圾回收呢?或者是我漏掉了什么重要的东西吗?谢谢。
可能是重复的问题:
C++中的垃圾收集 - 为什么使用?
你好,我读了一些关于垃圾回收器的文章,但有一件事我仍然不明白 - 为什么要使用垃圾回收?
我来尝试解释一下我的想法:
垃圾回收器应该会在没有需要时释放动态分配的内存,对吧?那么,如果你用 C 语言编写程序,你知道是否需要某个内存块,如果不需要,就可以直接销毁它。
那么,既然只需要明智地管理内存分配和释放,为什么还要使用垃圾回收呢?或者是我漏掉了什么重要的东西吗?谢谢。
为了更高的生产力。换句话说,程序员可以专注于编写与特定问题相关的独特代码块。
new
块创建对象以避免多次调用new
,也不会重新访问和清理未使用的new
对象缓存。大多数手动垃圾收集方法集中于在块边界上释放内存,这可能导致垃圾存留的时间比它需要的时间更长。因为我们已经不再生活在80年代初了。当你想要创建一个惊人的应用程序时,关注最低层任务既浪费开发者的时间又令人厌烦。
vector
不需要任何麻烦,也不用担心。如果你想称之为垃圾回收,那也可以,但这是一个相当广泛的定义。 - GManNickG我同意mouviciel的评论。但是垃圾收集器确实可以加快开发速度,因为开发人员不再需要担心内存泄漏,可以专注于程序的其他方面。
但请注意,如果您正在使用具有垃圾收集功能的语言进行编程,则非常明智地了解这一事实。在我看来,几乎必须要理解它的工作原理以及背后所做的事情。
这是一种反“愚蠢程序员”的机制。相信我,当代码变得非常复杂时,当以动态分配内存的方式思考时,我们都同样愚蠢。
在我短暂的程序员经验中,我花费了(累计)数日时间试图弄清楚为什么valgrind(或其他类似工具)报告内存泄漏,当一切看起来都是如此“明智编码”时。
如果你使用C语言编写程序,你知道是否需要一些内存空间,如果不需要,你可以简单地销毁它。
至少在理论上是这样的。问题是这可能会大大复杂化代码。例如:
for (x in ComputeBigList()) ...
变成这样
var xs = ComputeBigList();
try {
for(x in xs) ...
} finally {
FreeMemory(xs);
}
ComputeBigList
的结果,将其存储在一个变量中,然后添加一个包含在finally
中的删除语句,以确保它被删除。这就是C++粉丝应该指出C++的保证析构函数调用可以使这个过程更容易的地方。尽管如此,你仍需要考虑与引用计数相关的开销和额外的代码,假设你想让对象能够逃离它们创建的动态范围。(例如:我分配了一个对象,然后把它返回。) 垃圾回收器还有一个有用的功能是控制内存的使用方式。可重定位GC能够让你安排对象,使得它们可以更有效地访问。总的来说,GC为运行时提供了更多关于何时付出回收内存代价的灵活性。(显式释放和引用计数更新必须立即执行。)