Где именно переменные или идентификаторы хранятся в C ++? - PullRequest
1 голос
/ 22 октября 2019

Согласно моим текущим знаниям переменные (идентификаторы) указывают на объект определенного типа (int, bool и т. Д.), Которые являются объектами в памяти. Где и как хранятся сами переменные? Хранятся ли они вместе с объектами, на которые они указывают, или они хранятся в каком-то другом месте?

Например;

int main()
{
    int a_number = 2;
    return 0;
}

Таким образом, переменная a_number указывает на объект int в памяти, но гдеэто само число?

Если, скажем, 2 находится в 4-байтовой памяти, то занимает ли a_number его часть? Или a_number потребляет какую-то другую выделенную память где-то ??

Кстати, в настоящее время я изучаю C ++ (я новичок в программировании), и я думал об этом и не мог реально визуализировать это. Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 октября 2019

В этом конкретном случае a_number называет объект int, который потребляет sizeof(int) байтов и имеет автоматическую продолжительность хранения. Память для хранения с автоматической продолжительностью обычно выделяется в кадре стека функции, которой принадлежит объявление (в данном случае main()).

a_number фактически становится именем для хранимого объекта intв этих байтах. Имя не существует во время выполнения, потому что оно больше не нужно в это время. Единственная цель имени - позволить вам ссылаться на объект в коде.

1 голос
/ 23 октября 2019

Переменные могут храниться в областях памяти или в регистрах процессора, в зависимости от настроек компилятора и оптимизации.

Предположим, что ваш компилятор использует стек для локальных переменных и параметров функции. Ваша переменная a_number будет помещена в стек, поскольку ее время жизни является временным (исчезнет после того, как выполнение выйдет из функции).

Компилятору разрешено помещать a_number в процессор register. В этом случае переменная не существует в памяти, потому что регистры процессора не находятся в памяти (у них нет адресов).

Поскольку ваша программа не использует переменную a_number после объявления, компилятор может исключить переменную и не использовать память. Нет различий в поведении вашей программы с переменной или без нее;таким образом, компилятор может исключить переменную.

Расположение вашей переменной зависит от вашего компилятора. Ваш компилятор может хранить переменные «в стеке», в регистре процессора или исключать переменные. Расположение также зависит от «настроек оптимизации» вашего компилятора. Некоторые компиляторы могут не оптимизировать на самых низких настройках и удалить переменную на более высоких настройках.

1 голос
/ 22 октября 2019

но где находится a_number сам по себе?

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

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