Как в стеке хранятся значения переменных, если они хранятся в структуре LIFO? - PullRequest
0 голосов
/ 11 февраля 2020

Я немного запутался в том, как компилятор хранит переменные в стеке. Я читал, что c ++ может хранить локальные переменные в стеке, но если стек LIFO, как он может вызывать правильную переменную при вызове переменной в программе?

1 Ответ

0 голосов
/ 11 февраля 2020

Стек времени выполнения - это не просто структура LIFO; это сложная структура, которая поддерживает произвольный доступ.

Обычно на многих платформах работает так, что при вводе функции в стек помещается новый стек frame (мода LIFO). Локальные переменные хранятся в кадре и доступны относительно более или менее стабильного указателя, хранящегося в регистре.

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

Стеки времени выполнения также обычно поддерживают отправку и извлечение отдельных значений ad ho c с целью временного сохранения значений регистра или передачи параметров.

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

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

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

Основа c принцип состоит в том, что когда данная функция выполняется, то стек находится в правильном состоянии, ожидаемом этой функцией (если что-то не пошло ужасно неправильно из-за ошибки, вызывающей повреждение или что-то в этом роде). Стратегия выделения LIFO стековых фреймов тесно отслеживает вызовы функций и их возврат. Вызываемые функции должны сохранять и восстанавливать определенные регистры («регистры, сохраненные вызываемым абонентом»), что помогает поддерживать стабильную среду стека.

...