как переменные хранятся в стеке?

1

Я читал, что есть два региона памяти: один стек и другая куча. Основные типы данных, такие как 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 находится поверх стека?

  • 0
    Вы смешиваете некоторые концепции очень низкого уровня с языком высокого уровня, который абстрагирует все это для вас.
  • 0
    Это означает, что стек, в котором хранятся переменные, не является тем же стеком, что и в структуре данных?
Теги:
stack
heap

3 ответа

1
Лучший ответ

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

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

1

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

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

Кроме того, нашел этот отличный ответ на то, что живет в стеке от Марка Гравелла, скопированного ниже.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню