Чтение из стека и выделение памяти во время компиляции - PullRequest
0 голосов
/ 28 ноября 2011

Объекты могут быть надеты и удалены только из верхней части стопки.Но как насчет чтения и записи их значений?Пожалуйста, исправьте меня, если я ошибаюсь, но я думаю, что процесс должен быть в состоянии читать из любой части стека, так как, если бы было возможно чтение только сверху, ему пришлось бы удалить (и где-то хранить) все содержимое стека вышепеременная, которую он хочет изучить.Но в таком случае, как процесс узнает, где именно в стеке находится конкретная переменная?Я подозреваю, что он просто содержит указатель на него, но где хранится этот указатель?

Другое дело - читая о стеках, я часто нахожу фразы типа «Вся память, выделенная в стеке, известна во время компиляции».Что ж, я, вероятно, неправильно понял это, поэтому, пожалуйста, скажите мне, в чем заключается недостаток в моей логике: предположим, локальная переменная создается, когда утверждение if() истинно, а не когда оно ложно.Правда ли это получится во время выполнения.Таким образом, во время компиляции нет способа узнать, нужно ли его создавать, поэтому я не думаю, что память для него выделена вообще, так как это было бы расточительно.Следовательно, он не создается / не известен во время компиляции.

1 Ответ

0 голосов
/ 28 ноября 2011

Во время компиляции известно, сколько места требуется каждому типу: например, целое число имеет ширину 4 байта на 32-битных платформах, а класс с двумя целыми числами потребляет 8 байтов.Распределение этого пространства для определенной переменной не обязательно известно (может зависеть от if, как вы указали).

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

Так что для этого стека не совсем верно, что вы можете получить доступ к вершинетолько элемент.Это, однако, для структуры данных стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...