Является ли стек в памяти на самом деле стеком?

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

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


person node ninja    schedule 08.04.2011    source источник


Ответы (5)


стек на самом деле является стеком LIFO.

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

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

Стеки оборудования

Стек вызовов

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

person Yochai Timmer    schedule 08.04.2011

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

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

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

person Justin Ethier    schedule 08.04.2011

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

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

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

person user607139    schedule 08.04.2011

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

person user541686    schedule 08.04.2011
comment
Я говорю о стеке, который использует push и pop. - person node ninja; 09.04.2011

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

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

person Nicholas Carey    schedule 08.04.2011