C ++ предлагает программистам выбор размещения объектов в куче или в стеке.
Распределение на основе стека более эффективно : выделение дешевле, затраты на освобождение действительно равны нулю, а язык помогает разграничивать жизненные циклы объекта, снижая риск забывания освободить объект.
С другой стороны, в C ++ вы должны быть очень осторожны при публикации или совместном использовании ссылок на объекты, основанные на стеке, поскольку объекты, основанные на стеке, автоматически освобождаются, когда кадр стека разматывается, что приводит к висящим указателям.
С помощью оператора new
все объекты размещаются в куче в 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, например, escape-анализ использует распределение стека.
Этот анализ, выполненный компилятором времени выполнения, может заключить, например, что на объект в куче ссылаются только локально в методе, и никакая ссылка не может выйти из этой области. Если это так, Hotspot может применять оптимизации во время выполнения. Он может размещать объект в стеке или в регистрах вместо кучи.
Такая оптимизация, хотя и не всегда считается решающим ...