Стек в памяти на самом деле является стеком? - PullRequest
4 голосов
/ 08 апреля 2011

В памяти есть раздел, называемый стеком, который начинается сверху и растет в направлении кучи.Является ли этот стек тем же, что и стек LIFO?Является ли куча внизу FIFO?

Когда вы выполняете «push» и «pop», это изменяет стек в памяти?

Ответы [ 5 ]

4 голосов
/ 08 апреля 2011

Стек фактически является стеком LIFO.

Он создается самой программой во время ее работы.Код, управляющий стеком, создается во время компиляции.

Дальнейшее чтение:

Аппаратные стеки

Стек вызовов

Режимы адресации X86

3 голосов
/ 08 апреля 2011

Да, стек LIFO используется компьютерной архитектурой для хранения таких вещей, как адреса возврата, локальные переменные и т. Д. Из Википедия :

Архитектура x86 имеет аппаратное обеспечениеподдержка механизма стека выполнения.Такие команды, как push, pop, call и ret, используются с правильно настроенным стеком для передачи параметров, выделения места для локальных данных, а также для сохранения и восстановления точек возврата вызова.Инструкция ret size очень полезна для реализации соглашений о неэффективном (и быстром) вызове, когда вызываемый объект отвечает за освобождение стекового пространства, занятого параметрами.

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

2 голосов
/ 08 апреля 2011

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

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

Пример: указатель стека имеет значение 0x100, и это увеличивающаяся система. Затем вы нажимаете, и указатель стека находится в 0x104. Вы нажимаете снова, в 0x108. Вы поп, назад к 0x104. Другая система должна была бы начинаться с 0x100, понижаться до 0xfc, а затем понижаться до 0xf8 и возвращаться к 0xfc. Если вы снова появитесь, вы вернетесь к 0x100. Если вы затем вычтите 8 из стека указателя, он вернется к 0xf8, так что вы можете выскочить их снова. (Или, что бы C-компилятор делал в конце функции, просто добавьте / вычтите 12 из стека указателя, а не выталкивайте 3 локальные переменные в 3 инструкциях.

1 голос
/ 08 апреля 2011

«Стек», о котором вы говорите, - это стек вызовов программы, поэтому в этом смысле это стек. Но в этом нет необходимости: фактическая реализация зависит от времени работы оборудования, ОС и языка & mdash; Я использовал компиляторы C, в которых стек вызовов реализован в виде [двукратно] связанного списка кадров стека, размещенных в куче, аналогично тому, как ОС IBM для мэйнфреймов работает.

Недостатком аппаратного стека фиксированного размера в стиле Intel / Windows является то, что он делает среду не очень благоприятной для рекурсии. OTOH, это делает наращивание стека очень эффективным, поскольку вам не нужно использовать ресурсы ОС для выделения памяти из кучи: он просто увеличивает указатель.

1 голос
/ 08 апреля 2011

Я не уверен, что вы подразумеваете под " на самом деле стеком" (что такое "настоящий" стек?), Но это концептуально то же самое: push уменьшает "указатель стека", иpop увеличивает его.

...