Я читал, что есть два региона памяти: один стек и другая куча. Основные типы данных, такие как int, double, float и т.д., Хранятся в стеке, а ссылочные типы хранятся в куче. Поскольку мы знаем, что стек является LIFO
это означает, что последний нажатый элемент будет удален первым. теперь предполагая следующий код
int first = 10;
double second = 20.0;
float third = 3.0F;
поэтому first
будут выдвинуты, затем second
а затем third
. поэтому переменная third
которая имеет тип float, будет находиться поверх стека, но если я буду использовать следующий код (предположим на С#),
Console.WriteLine(second);
как будет доступно значение переменной second
, в то время как переменная third
находится поверх стека?
Stack ведет себя как LIFO с PUSH и POP insturctions. Но это не означает, что без pop вы можете прочитать память стека. В вашем случае вы
push int first (* its not a opcode of machine, just trying to explain)
push double second
push float third
Now you have 2 options to access the variables that you have pushed.
1) pop -> This is the one that reads and makes stack look like lifo.
if you pop it
stack will be
int first
double second.
Bsically it removes(not exactly,just a register is chaged to show the stacks last valid memory position)
2) But if you want you can jst read it without pop.Thus not removing the last times.
So you will say Read me double.And it will access the same way it does in heaps..
That will cause machine to execute a mov instruction .
Please note its EBP(Base pointer) and ESP(Stack pointer) that points to the location of a stacks variables.And machines read variables as mov eax,[ebp+2(distance of "second" from where base pointer is now pointing]].
Вы неправильно понимаете, на что ссылается the stack
. Существует структура данных Stack
которая использует push
и pop
для хранения данных, но основанная на стеке и головная память - гораздо более абстрактная концепция. Вы можете попытаться взглянуть на статью Wiki о распределении памяти на основе стека, но вам также нужно будет узнать больше об указателях сборки и рамки. На эту тему преподаются целые классы.
Я думаю, вы неправильно поняли эту концепцию.
У Эрика Липперта есть несколько сообщений по этой теме, которые я бы рекомендовал прочитать. Управление памятью - это передовая тема.
Кроме того, нашел этот отличный ответ на то, что живет в стеке от Марка Гравелла, скопированного ниже.
"Все типы VALUE будут выделены для Stack" очень, очень неправильно; переменные структуры могут жить в стеке, как переменные метода. Тем не менее поля с типом живут с этим типом. Если тип объявления поля является классом, значения находятся в куче как часть этого объекта. Если тип объявления поля является структурой, поля являются частью этой структуры, где бы она ни существовала.
Даже переменные метода могут находиться в куче, если они захвачены (метод лямбда /anon) или часть (например) блока итератора.