Почему есть стек и куча? - PullRequest
       52

Почему есть стек и куча?

12 голосов
/ 19 августа 2011

Почему языки ассемблера используют как стек, так и кучу?Они кажутся излишними.

Ответы [ 3 ]

13 голосов
/ 19 августа 2011

Они не избыточны. У каждого из них есть свои сильные и слабые стороны: стек используется быстрее, если его правильно использовать, потому что распределение памяти тривиально (push / pop). Недостатком является то, что вы можете добавлять и удалять только элементы сверху (отсюда и название, стек). Кроме того, общее пространство стека ограничено, и когда у вас заканчивается, у вас ... ну, переполнение стека. Куча, напротив, допускает случайное распределение и освобождение, и вы можете хранить там большие объемы данных, но недостатком является то, что распределение несет больше накладных расходов - для каждого выделенного блока памяти должна быть найдена подходящая свободная часть, и в В долгосрочной перспективе необходимо избегать фрагментации свободного пространства, и система должна отслеживать, где находятся свободные блоки.

Вы используете стек для передачи небольших краткосрочных значений, например, переменные локального счетчика, аргументы функций, возвращаемые значения и т. д .; они пригодны для стиля распределения push / pop. Для больших или долгоживущих структур данных вы используете кучу.

3 голосов
/ 19 августа 2011

Вы, безусловно, могли бы построить вычислительную систему, которая использовала бы одну из них в качестве единственной модели памяти.Тем не менее, они оба имеют довольно разные свойства, каждое из которых имеет свои плюсы и минусы.Большинство систем используют обе возможности, чтобы получить преимущества от каждой из них.

Стеки

Стек можно рассматривать как стопку пластин, вы записываете значениена пластине и положить его на вершину стека, это называется операцией push и сохраняет значение в стеке.Очевидно, что вы также можете удалить верхнюю пластину из стопки, это называется операцией pop.Но новые распределения всегда должны быть на вершине стека.

Стек, как правило, используется для локальных переменных и передачи значений между функциями.Как правило, стеки имеют следующие удивительные свойства:

  • Требуется лишь несколько указателей для управления
  • Очень легко реализовать в оборудовании, большинство процессоров имеют встроенную аппаратную поддержку стека, делающего егоеще быстрее.
  • Очень быстрое выделение памяти

Проблема со стеком связана с тем фактом, что элементы могут быть добавлены / удалены только из верхней части стека.Теперь это имеет смысл при переходе вверх и вниз по вызовам функций: извлечение функций из стека, выделение места для локальных переменных в стеке, запуск функции, удаление локальных переменных из верхней части стека и помещение возвращаемого значения в стек,С другой стороны, если я хочу выделить некоторую память и сказать, передать ее другому потоку или вообще освободить ее далеко от того места, где она была выделена, у меня внезапно возникла проблема, стек не в правильном положении, когда я хочудля освобождения памяти.

Можно сказать, что стек облегчает быстрое последовательное выделение памяти.

Куча

Теперь куча отличается, каждое выделение обычноотслеживается отдельно.Это приводит к большим накладным расходам на распределение и освобождение, но каждый из них может обрабатываться независимо от других выделений памяти, ну, пока вы не исчерпаете память.

Существует множество алгоритмов для выполнения этого, и это, вероятно, немногонеразумно писать о них здесь, но здесь есть ссылка, рассказывающая о нескольких хороших простых алгоритмах выделения кучи: Альтернативы malloc и новым

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

2 голосов
/ 19 августа 2011

Речь идет об обработке и управлении памятью.Существуют разные типы регистров архитектуры x86.Существуют возможности аппаратного управления памятью в архитектуре x86 и т. Д.

Стек используется указателем инструкций, в некоторых приложениях - куча для сегмента данных.

Чтобы прочитать больше, я советую прочитатьследующие ссылки:

«Модель памяти позволяет компилятору выполнять много важных оптимизаций»- Википедия

...