Как получить доступ к переменным в стеке? - PullRequest
5 голосов
/ 08 февраля 2009

Предположим, у нас есть следующие локальные переменные:

int a = 0;
int b = 1;
int c = 2;
int d = 3;

Насколько я знаю, они будут размещены в системном стеке, например:

|   |
| 3 | d
| 2 | c
| 1 | b
|_0_| a

Означает ли это, что для получения значения a значения d, c и b должны быть сначала вытолкнуты из стека? Если да, куда эти значения идут? Означает ли это, что доступ к недавно объявленным переменным будет быстрее? Или я что-то упустил (что, я подозреваю, так), и все это работает по-другому?

РЕДАКТИРОВАТЬ: спасибо, ребята!

Ответы [ 3 ]

16 голосов
/ 08 февраля 2009

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

На практике такие переменные также могут храниться в регистрах процессора.

5 голосов
/ 08 февраля 2009

Или я что-то упустил

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

1 голос
/ 08 февраля 2009

Значит ли это, что для того, чтобы получить значение а, значения д, с и б должен сначала выскочить из стек

Излучаемый код просто перемещает указатель стека на правильное количество байтов при входе в функцию. При выходе из функции он перемещается назад на то же расстояние. Таким образом, он не выскакивает из переменных по отдельности. Предполагая, что int равен 4 байтам, приведенный вами пример переместит указатель стека на 16 байт. Это фактически перемещает это далее чем это из-за другой информации в кадре стека, такой как адрес возврата.

...