Нет ничего в языке, который говорит, что a
будет в стеке.Компилятор имеет право размещать его там, где он хочет;и, в частности, если ему не нужно никуда его помещать, это не нужно.
Переменная a
никогда не используется после того, как вы в нее положили 5, поэтому приличный оптимизатор бросит эту строкуполностью.
Однако, в вашем конкретном случае, мне кажется, что a
действительно в стеке.Он находится в -8 байтах от указателя кадра в% rbp.То есть адрес a
равен -8 (% rbp) или «значение в регистре rbp, минус 8», что довольно близко к вершине стека.
Чтобы получить большедетализированы.Стек существует в памяти.Давайте предположим, что стеки в памяти растут вниз (это обычно), так что «верх» стека увеличивается в сторону меньших адресов.Существует «указатель стека», который указывает на вершину стека, т. Е. Адрес последней добавленной в стек вещи (я говорю здесь в общих чертах).
Чтобы выделить N байтов стекаместа, все, что нужно, это вычесть N из указателя стека.Сгенерированный код обычно делает это в одной инструкции, так как он знает общее пространство, необходимое для вводимой функции.Чтобы освободить это пространство, код может либо (а) добавить N, либо (б) восстановить значение предварительного вычитания указателя стека, которое он где-то сохранил.Выбор действительно определен более мелкими деталями того, как система компилятора хочет управлять стеком.
Существуют вспомогательные регистры, которые могут использоваться в управлении стеком.Распространенным является наличие «указателя кадра», который играет роль, которую% rbp выполняет здесь.