分配速度快得多。它是在 O (1)中完成的,因为它是在设置堆栈帧时分配的,所以基本上是空闲的。缺点是,如果您用完了堆栈空间,就会陷入很大的麻烦。您可以调整堆栈大小,但是,IIRC,您有大约2MB 可以使用。另外,一旦退出该函数,堆栈上的所有内容都将被清除。因此,以后再引用它可能会有问题。(指向堆栈已分配对象的指针会导致 bug。)
int main() {
// the object that s points to has dynamic storage
// duration
string *s = new string;
// pass a pointer pointing to the object around.
// the object itself isn't touched
foo(s);
delete s;
}
void foo(string *s) {
cout << s->size();
}
当性能不是一个大问题时,垃圾收集是一种很好的机制。我听说 GC 正在变得越来越好,越来越复杂,但事实是,您可能被迫接受性能损失(取决于用例)。如果你懒惰,它仍然可能无法正常工作。在最好的情况下,当垃圾收集器意识到没有更多的引用时,它会意识到您的内存消失了(参见 参考计数)。但是,如果您有一个引用自己的对象(可能通过引用另一个引用回来的对象) ,那么仅仅引用计数并不表示可以删除内存。在这种情况下,GC 需要查看整个引用汤,并确定是否有任何岛屿只被它们自己引用。不经意间,我猜测这是一个 O (n ^ 2)运算,但是不管它是什么,如果您关心性能的话,它可能会变得很糟糕。(编辑: 马丁 B 指出,它是 O (n)的合理有效的算法。如果您关心的是性能,并且可以在不进行垃圾回收的情况下在常量时间内释放,那么这仍然是 O (n)过多。)
就我个人而言,当我听到人们说 C + + 没有垃圾收集功能时,我的脑海里就会把它标记为 C + + 的一个特性,但我可能是少数。对于用 C 和 C + + 编程的人来说,最难学习的可能是指针以及如何正确处理动态内存分配。其他一些语言,比如 Python,如果没有 GC 就会很糟糕,所以我认为这可以归结为你想从一门语言中得到什么。如果你想要可靠的性能,那么没有垃圾收集的 C + + 是我能想到的唯一的事情。如果您想要易用性和辅助轮(不需要学习“适当的”内存管理即可避免崩溃) ,请选择使用 GC。即使您知道如何很好地管理内存,它也会节省您可以用来优化其他代码的时间。实际上性能方面的损失已经不大,但是如果您真的需要可靠的性能(以及确切知道正在发生什么、什么时候发生、在什么情况下发生的能力) ,那么我还是坚持使用 C + + 。我听说过的所有主流游戏引擎都是用 C + + (如果不是 C 或汇编语言的话) ,这是有原因的。Python 等编写脚本是可以的,但主要的游戏引擎就不行了。