在c ++风格或垃圾收集器中释放内存有什么区别?

时间:2015-05-14 11:00:20

标签: c++ garbage-collection

我经常听说c ++比使用垃圾收集器的每种语言“更快”。我不认为这是唯一的原因,但我读到有一点是在c ++中你可以更快地释放内存。

假设只谈论一种语言释放记忆的方式,那么,时间来说,如果你摧毁每个对象,例如在他的范围结束时,或者如果GC选择何时做,那么第一种方式更快?

4 个答案:

答案 0 :(得分:2)

确实,垃圾收集者有价格。

例如,他们在Quantifying the Performance of Garbage Collection vs. Explicit Memory Management论文中说:

  

比较   运行时,空间消耗和虚拟内存占用   在一系列基准测试中,我们展示了运行时性能   性能最佳的垃圾收集器具有明确的竞争力   内存管理给予足够的内存。特别是,   当垃圾收集的内存是其五倍时   根据需要,其运行时性能匹配或稍微超过   显式内存管理。但是,垃圾收集   当它必须使用更小时,性能会大幅下降   堆。内存的三倍,运行速度慢了17%   平均而且内存的两倍,运行速度慢了70%。垃圾   物理时,集合也更容易被分页   记忆稀缺。在这种情况下,所有的垃圾收集器   我们在这里检查遭受数量级的性能惩罚   相对于显式内存管理。

答案 1 :(得分:2)

"更快"是一个非常模糊的概念;实际的物体破坏和记忆的释放将同样快速,但它的煽动。

C ++模型的优点在于它的确定性(破坏发生在已知的时间,而不是每当垃圾收集器转向它时),并且可以减少开销(垃圾收集器需要做一些工作弄清楚哪些对象不再使用了。)

第一点是最重要的:它意味着您可以使用相同的技术来管理所有类型的资源,包括必须在正确的时间发布的锁,而不仅仅是动态分配的对象。

因此,在C ++中,动态对象和锁的行为类似:

{
    std::unique_ptr<Thing> thing(new Thing);
    do_stuff(thing);
} // automatically destroyed here (if still owned by the pointer)

{
    std::unique_lock<std::mutex> lock(mutex);
    do_stuff();
} // automatically unlocked here (if still owned by the lock)

虽然假设的垃圾收集语言会以不同的方式对待它们:

{
    Thing thing = new Thing;
    do_stuff(thing);
} // automatically destroyed at some point, probably

try {
    mutex.lock();
    do_stuff();
} finally {
    mutex.unlock();  // manually unlocked here
}

答案 2 :(得分:1)

这是一个复杂的主题,但我可以展示一些极限情况:

例如,如果你使用C ++而不是c#,你知道内存管理的区别在于内存是免费的

  • 当垃圾收集器(GC)需要它时(对于C#)

  • 当程序员需要它时(对于C ++)

因此,如果您在C ++中创建一个程序,只要您不再需要它就会释放内存,那么内存占用率就会降低,从而带来更多性能。

这假设释放内存的成本很小。

希望有所帮助

答案 3 :(得分:0)

不,由于没有垃圾收集器,C ++不一定更快。

因此,在一个极端情况下,有一些程序可以明确地管理它们的资源使用情况,而垃圾收集器对于这些程序来说会比帮助更容易受到阻碍。另一个极端是一个程序,它对资源管理没有多大帮助,如果有垃圾收集器的帮助,它可能会运行得更好。在这两个极端之间,取决于它。

垃圾收集器的存在确实倾向于鼓励编写不能密切管理其内存的代码。毕竟,垃圾收集器的一个目的是给程序员这样的自由。使用相同的技术,但没有垃圾收集器,往往会导致程序使用(并泄漏!)更多的内存,并且 - 如果执行一段时间 - 运行速度更慢。相反,一个程序编写,因此它明确地管理内存,因为它假设没有垃圾收集器存在,可能不会受益太多,并且可能会受到影响,如果然后引入垃圾收集器。