Я думаю, что понимаю основную разницу между стеком и кучей.
В следующей программе в куче создается объект размера 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
или*p
? Потому что с производными классамиp
также может указывать на подобъект базового класса внутри более крупного объекта. - person MSalters   schedule 26.11.2014