Вы, безусловно, могли бы построить вычислительную систему, которая использовала бы одну из них в качестве единственной модели памяти.Тем не менее, они оба имеют довольно разные свойства, каждое из которых имеет свои плюсы и минусы.Большинство систем используют обе возможности, чтобы получить преимущества от каждой из них.
Стеки
Стек можно рассматривать как стопку пластин, вы записываете значениена пластине и положить его на вершину стека, это называется операцией push и сохраняет значение в стеке.Очевидно, что вы также можете удалить верхнюю пластину из стопки, это называется операцией pop.Но новые распределения всегда должны быть на вершине стека.
Стек, как правило, используется для локальных переменных и передачи значений между функциями.Как правило, стеки имеют следующие удивительные свойства:
- Требуется лишь несколько указателей для управления
- Очень легко реализовать в оборудовании, большинство процессоров имеют встроенную аппаратную поддержку стека, делающего егоеще быстрее.
- Очень быстрое выделение памяти
Проблема со стеком связана с тем фактом, что элементы могут быть добавлены / удалены только из верхней части стека.Теперь это имеет смысл при переходе вверх и вниз по вызовам функций: извлечение функций из стека, выделение места для локальных переменных в стеке, запуск функции, удаление локальных переменных из верхней части стека и помещение возвращаемого значения в стек,С другой стороны, если я хочу выделить некоторую память и сказать, передать ее другому потоку или вообще освободить ее далеко от того места, где она была выделена, у меня внезапно возникла проблема, стек не в правильном положении, когда я хочудля освобождения памяти.
Можно сказать, что стек облегчает быстрое последовательное выделение памяти.
Куча
Теперь куча отличается, каждое выделение обычноотслеживается отдельно.Это приводит к большим накладным расходам на распределение и освобождение, но каждый из них может обрабатываться независимо от других выделений памяти, ну, пока вы не исчерпаете память.
Существует множество алгоритмов для выполнения этого, и это, вероятно, немногонеразумно писать о них здесь, но здесь есть ссылка, рассказывающая о нескольких хороших простых алгоритмах выделения кучи: Альтернативы malloc и новым
Таким образом, куча облегчает случайное распределение памяти, но это происходитсо штрафом за время выполнения, однако этот штраф часто невелик по сравнению с тем, что было бы понесено, если бы вам пришлось справляться с ситуацией, используя только стек.