Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Стеки

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

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

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

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

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

Heap

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

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

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

Ответ 3

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

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

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

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