Java

Помогите со стеком

Вот объясните барану, стек это структура наподобие рожка автомата (последний вошёл первый вышел) если мы объявляем перемену например "int a=10 " потом "int b =20" они попадают в стек, после этого я изменяю пременую "а" переменую "b" я не трогал. Как так ?? Ведь должна сначала удалится переменая "b" со стека так как она первая на очереди и по правилах через нее я перешагнуть не могу? У меня плавятся мозги помогите плиз !
Вне майн int a=10
будет создана на этапе компиляции в глобальной области, то бишь в самой программе. Когда программа запустится, то бишь запишется, то и будет адрес памяти.
Стек по существу тоже область памяти, но стек задается вот описанием переменной в функции
void f(int a, int b)
{
}
Хоть и заданы две и созданы int типа, но доступ к ним есть свободный через указатель на стек. Когда из функции выйдешь то только тогда стек свернется, то бишь ты патроны заберешь из рожка.
Zura Khvedeliani
Zura Khvedeliani
71 447
Лучший ответ
Ты не помещаешь никуда свои переменные, а только копируешь их значения в стек. С самими переменными ты дальше можешь делать что хочешь и в какой угодно последовательности.
По факту стэк нужен для контролирования памяти при вызове функция, В действительности же ты, именованными переменными, ссылаешся на конкретную ячейку в этом стеки и он уже больше куча (heap) нежели стек.
Впу27 Впу27
Впу27 Впу27
6 169
Стекфрейм в Джаве - это массив переменных + стек инструкций. Некоторые инструкции умеют адресоваться в этот массив.

int a = 10;
int b = 20;
a = 30;

компилируется в такой байткод:

0: bipush 10 // помещаем на вершину 10
2: istore_1 // делаем pop c вершины стека, помещаем значение в переменную по отступу 1
3: bipush 20 // стек пуст; помещаем на вершину 20
5: istore_2
6: bipush 30
8: istore_1
9: return

Понятия "стек" и "стекфрейм" в контексте Джавы иногда путают.
de
denis-asylgareev
1 202