我想我理解堆栈和堆之间的主要区别。
在下面的程序中,在堆上创建了一个大小为 n 的对象。在堆栈上创建了一个指向这个 sofar 无名对象的指针 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)我知道编译后的程序也驻留在内存中的某个地方以指导它的执行。这是在堆栈还是堆上,还是这仍然是内存的另一部分?