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