我认为我理解了堆栈和堆之间的主要区别。
在下面的程序中,一个大小为n的对象被创建在堆上。一个指针p指向这个无名对象被创建在堆栈上,它占用4个字节(至少在我的系统上)。如果我理解正确,由于引用不使用额外的内存,除了可能在堆栈上返回main()函数的int值之外,不会分配更多的内存。
Class Object; // n bytes
int main() {
Object* p = new Object();
Object& r = *p;
// ...
}
然而,内存管理仍不完全清楚:
1)变量p和r的名称存储在哪里?它们都是局部变量,所以我认为它们也应该放在堆栈上?这难道不需要额外的内存来存储一个变量名和它引用到的内存部分之间的绑定关系吗?
2)指针的类型存储在哪里?指针仅占据堆栈上的4个字节,这(我认为)是存储内存地址的精确大小。计算机如何知道可以在该地址找到哪种类型?
3)与(2)类似,堆上的Object需要n个字节的存储空间,而对它的(直接)引用需要0个字节。此对象的类型存储在哪里,因此当使用r时,它知道它是哪种类型?
4)我了解到编译的程序也驻留在某个地方的内存中以指导其执行。这是在堆栈还是堆上,或者这仍然是内存的另一部分?
p
或*p
的类型?因为在派生类中,p
也可能指向较大对象内的基类子对象。 - MSalters