Где в памяти хранятся имена или типы переменных / ссылок для переменных стека / кучи?

Я думаю, что я понимаю основное различие между стеком и кучей.

В следующей программе Объект размера n создается в куче. Указатель p, относящийся к этому безымянному объекту, создается в стеке, где он занимает 4 байта (по крайней мере, в моей системе). Если я правильно понял, поскольку ссылки не используют дополнительную память, дальнейшая память не выделяется (за исключением, возможно, int, возвращаемого main () в стеке).

Class Object;  // n bytes

int main() {
Object* p = new Object();
Object& r = *p;
// ...
}

Тем не менее, управление памятью еще не полностью ясно:

1) где хранятся имена p и r? Они оба являются локальными именами, поэтому я полагаю, что они также должны идти в стек? Разве это не требует дополнительной памяти для хранения связи между именем переменной и частью памяти, к которой она относится?

2) где хранится тип указателя? Указатель занимает всего 4 байта в стеке, что (я думаю) является точным размером для хранения адреса памяти. Как компьютер узнает, какой тип можно найти по этому адресу?

3) аналогично (2), объекту в куче требуется n байтов памяти, а единственная (прямая) ссылка на него — 0 байтов. Где хранится тип этого объекта, поэтому, когда используется r, он знает, какой это тип?

4) Я понял, что скомпилированная программа также находится где-то в памяти, чтобы управлять ее выполнением. Это в стеке или в куче, или это все еще другая часть памяти?

3

Решение

где хранятся имена p и r?

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

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

где хранится тип указателя?

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

Где хранится тип этого объекта?

Если тип полиморфный (то есть, если это тип класса, по крайней мере, с одной виртуальной функцией), тогда будут некоторые статические данные, хранящиеся в неуказанном месте, к которому у вас нет прямого доступа, для описания типа. Будет достаточно данных для поддержки вызовов виртуальных функций (обычно это таблица указателей на окончательные переопределения) и RTTI (спецификация структуры наследования для использования dynamic_castи type_info структура доступна через typeid).

В противном случае вся информация о типе является статической.

Находится ли [скомпилированная программа] в стеке или в куче, или это все еще другая часть памяти?

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

7

Другие решения

поскольку ссылки не используют дополнительную память, дальнейшая память не выделяется

Как реализованы ссылки, не указано в Стандарте C ++, но большинство компиляторов будут реализовывать их так же, как указатели, поэтому в неоптимизированном коде, вероятно, будут еще 4 байта (в вашей системе) для r….

где хранятся имена p и r

здесь тип указателя хранится?

Где тип [r] хранится

Они существуют внутри самого компилятора во время его работы и, возможно, в некоторой информации об отладочных символах, помещаемой в сгенерированные объекты / библиотеки / программы, чтобы помочь интерактивной отладке, например, если вы используете, например. ССЗ g++ -g вариант, но они не хранятся и не доступны через обычные операторы программы C ++.

Я понял, что скомпилированная программа также находится где-то в памяти, чтобы управлять ее выполнением. Это в стеке или в куче, или это все еще другая часть памяти?

Скомпилированная программа представляет собой набор двоичных данных и кодов операций (чисел) машинного кода, которые операционная система знает, как загрузить и попросить процессор интерпретировать и выполнить. Эти данные обычно находятся не в стеке и не в куче, а в виде сегментов / областей «неинициализированных данных», «инициализированных данных» и «кода», которые размещает операционная система.

3

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

gcc -S -c code.c

В коде s вообще нет p и r

1
По вопросам рекламы [email protected]