примитивов можно найти в обоих местах.
class Foo
{
public int x;
public static void Main()
{
int y = 3; // y is on the stack
Foo f = new Foo(); // f.x is probably on the heap
}
}
, за исключением того, что вам на самом деле все равно, если вы не создаете JVM.По-настоящему умный оптимизатор может решить, что поскольку Foo, который указывает на f, никогда не выходит из Main и никогда не передается другой функции, его можно безопасно разместить в стеке.*
Стек и куча отличаются не тем, что в них хранится, а операциями, предусмотренными для них.Стек позволяет вам выделить часть памяти в режиме LIFO, вы не можете освободить часть, пока все части моложе, чем она также не была освобождена.Это удобно согласуется с тем, как используется стек вызовов.Вы можете поместить что-нибудь в стек, если это нормально, когда эта функция исчезнет, когда ваша функция вернется.Это оптимизация, поскольку она очень быстро выделяется и освобождается из стека, поскольку поддерживает только использование таким образом.При желании можно хранить все локальные переменные для функции в куче в реализации.Куча более гибкая и, следовательно, более дорогая в использовании.Было бы неправильно сказать, что у объекта есть стек и куча, как я уже сказал, что отличает стек от кучи не от того, что в нем, а от доступных операций.