Я думаю, что я понимаю основное различие между стеком и кучей.
В следующей программе Объект размера 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) Я понял, что скомпилированная программа также находится где-то в памяти, чтобы управлять ее выполнением. Это в стеке или в куче, или это все еще другая часть памяти?
где хранятся имена p и r?
Это не так — имена переменных являются статическими и не доступны во время выполнения. Компилятор знает, где будут храниться переменные, и генерирует код для доступа к этой области памяти без имени.
Они могут быть доступны в специальном разделе отладки программного файла, чтобы отладчик мог отображать значения переменных.
где хранится тип указателя?
Это не так — типы также являются статическими (за исключением ограниченной информации о динамических типах, связанной с полиморфными типами классов, но не с типами указателей). Компилятор знает тип и генерирует код для правильного доступа к сохраненному значению для этого типа.
Где хранится тип этого объекта?
Если тип полиморфный (то есть, если это тип класса, по крайней мере, с одной виртуальной функцией), тогда будут некоторые статические данные, хранящиеся в неуказанном месте, к которому у вас нет прямого доступа, для описания типа. Будет достаточно данных для поддержки вызовов виртуальных функций (обычно это таблица указателей на окончательные переопределения) и RTTI (спецификация структуры наследования для использования dynamic_cast
и type_info
структура доступна через typeid
).
В противном случае вся информация о типе является статической.
Находится ли [скомпилированная программа] в стеке или в куче, или это все еще другая часть памяти?
На типичном компьютере он находится в статической памяти ( код или же текстовый раздел), загружается при запуске программы. Во встроенных системах он может быть расположен более постоянно в постоянной памяти.
поскольку ссылки не используют дополнительную память, дальнейшая память не выделяется
Как реализованы ссылки, не указано в Стандарте C ++, но большинство компиляторов будут реализовывать их так же, как указатели, поэтому в неоптимизированном коде, вероятно, будут еще 4 байта (в вашей системе) для r
….
где хранятся имена p и r
здесь тип указателя хранится?
Где тип [
r
] хранится
Они существуют внутри самого компилятора во время его работы и, возможно, в некоторой информации об отладочных символах, помещаемой в сгенерированные объекты / библиотеки / программы, чтобы помочь интерактивной отладке, например, если вы используете, например. ССЗ g++ -g
вариант, но они не хранятся и не доступны через обычные операторы программы C ++.
Я понял, что скомпилированная программа также находится где-то в памяти, чтобы управлять ее выполнением. Это в стеке или в куче, или это все еще другая часть памяти?
Скомпилированная программа представляет собой набор двоичных данных и кодов операций (чисел) машинного кода, которые операционная система знает, как загрузить и попросить процессор интерпретировать и выполнить. Эти данные обычно находятся не в стеке и не в куче, а в виде сегментов / областей «неинициализированных данных», «инициализированных данных» и «кода», которые размещает операционная система.
Компьютеры никогда не знают р и р.
Имена переменных используются для улучшения читаемости в языках высокого уровня.
Например, вы можете получить код сборки через
gcc -S -c code.c
В коде s вообще нет p и r