C++ 为程序员提供了在堆上或栈上分配对象的选择。
基于堆栈的分配更有效:分配更便宜,释放成本真正为零,并且该语言在划分对象生命周期方面提供了帮助,降低了忘记释放对象的风险。
另一方面,在 C++ 中,在发布或共享对基于堆栈的对象的引用时需要非常小心,因为基于堆栈的对象会在堆栈帧展开时自动释放,从而导致指针悬空。
使用new
operator,所有对象都在 Java 或 C# 中的堆上分配。
Class1 obj = Class1();
实际上,编译器会尝试找到一个名为Class1()
.
例如,以下是一个常见的 Java 错误:
public class MyClass
{
//Oops, this has a return type, so its a method not a constructor!
//Because no constructor is defined, Java will add a default one.
//init() will not get called if you do new MyClass();
public void MyClass()
{
init();
}
public void init()
{
...
}
}
注意:“所有对象都在堆上分配”并不意味着偶尔不会在后台使用堆栈分配。
例如,在 Java 中,像逃逸分析这样的热点优化使用堆栈分配。
运行时编译器执行的这种分析可以得出结论,例如,堆上的对象仅在方法中被本地引用,并且没有任何引用可以从这个范围中逃脱。如果是这样,Hotspot 可以应用运行时优化。它可以在堆栈上或寄存器中分配对象,而不是在堆上。
虽然这种优化并不总是被认为是 决定性的......