примитивы можно найти в обоих местах.
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, вы не можете освободить часть, пока все части младше, чем она, также не будут освобождены. Это удобно совпадает с тем, как используется стек вызовов. Вы можете помещать в стек что угодно, если это нормально, когда эта вещь исчезнет, когда ваша функция вернется. Это оптимизация, так как он очень быстро выделяется и освобождается из стека, поскольку он поддерживает только использование таким образом. При желании можно было бы сохранить все локальные переменные для функции в куче в реализации. Куча более гибкая и, следовательно, более дорогая в использовании. Было бы неверно сказать, что у объекта есть стек и куча, как я уже сказал, что отличает стек от кучи не то, что в нем находится, а доступные операции.
05.09.2010
int y
был статическим членом :-P 09.02.2015