2015-01-11 4 views
1

Я читал, что есть две области памяти один стек и другая куча. Основные типы данных, такие как int, double, float и т. Д., Хранятся в стеке, а ссылочные типы хранятся в куче. Как мы знаем, стек равен LIFO, что означает, что последний нажатый элемент будет удален первым. Теперь предполагая следующий кодКак переменные хранятся в стеке?

int first = 10; 
double second = 20.0; 
float third = 3.0F; 

так, first будет выталкиваться первым, затем second, а затем third. поэтому переменная third, которая имеет тип поплавка будет на вершине стека, но если я использую следующий код (предполагая, что в C#)

Console.WriteLine(second); 

, как значение переменной second будет доступен в то время как переменная third находится на вершине стека ?

+0

Вы смешиваете некоторые очень низкоуровневые концепции с языком высокого уровня, который абстрагирует все это для вас. – Origin

+0

Это означает, что стек, в котором хранятся переменные, - это не тот же стек, что и в структуре данных? –

ответ

1

Stack ведет себя как LIFO с PUSH и POP insturctions. Но это не означает, что без поп-функции вы можете прочитать стек памяти. В вашем случае вы

 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]]. 
5

Вы неправильно понимаете, что the stack на самом деле имеет отношение к. Существует структура данных Stack, которая использует push и pop для хранения данных, но основанная на стеке и головная память - гораздо более абстрактная концепция. Вы можете попытаться взглянуть на Wiki article на распределение памяти на основе стека, но вам также нужно будет узнать больше об указателях сборки и рамки. На эту тему преподаются целые классы.

1

Я думаю, вы не поняли концепцию.

У Эрика Липперта есть несколько сообщений по теме, которые я бы рекомендовал прочитать. Управление памятью - это передовая тема.

Кроме того, found this great answer on what lives on the stack from Marc Gravell, скопирована ниже.

«Все типы VALUE будут выделены для стека» очень, очень неправильно; Структурные переменные могут находиться в стеке как переменные метода. Тем не менее, поля на тип живут с этим типом. Если тип объявления поля является классом , значения находятся в куче как часть этого объекта. Если тип объявления поля является структурой, поля являются частью этой структуры , где бы ни была эта структура.

Даже переменные метода могут находиться в куче, если они захвачены (lambda/anon-method) или часть (например) блока итератора.

Смежные вопросы