我想我了解堆栈和堆之间的主要区别。
在下面的程序中,在堆上创建了一个大小为 n 的对象。指向这个 sofar 无名对象的指针 p 在堆栈上创建,它占用 4 个字节(至少在我的系统上)。如果我理解得很好,因为引用不使用额外的内存,所以不会分配更多的内存(除了 main() 在堆栈上返回的 int 之外)。
Class Object; // n bytes
int main() {
Object* p = new Object();
Object& r = *p;
// ...
}
不过,内存管理还不完全清楚:
1) 名称 p 和 r 存储在哪里?它们都是本地名称,所以我想它们也应该进入堆栈?这不需要额外的内存来存储变量名和它所引用的内存部分之间的绑定(bind)吗?
2) 指针的类型存储在哪里?指针在堆栈上只占用 4 个字节,(我认为)这是存储内存地址的确切大小。计算机如何知道可以在该地址找到哪种类型?
3) 与(2)类似,堆上的Object需要n个字节的存储空间和唯一(直接)引用它的0个字节。这个对象的类型存在哪里,所以用r的时候就知道是什么类型了?
4) 我知道编译后的程序也驻留在内存中的某个地方来指导它的执行。这是在栈上还是堆上,还是内存的另一部分?
最佳答案
where are the names p and r stored?
它们不是——变量名是静态的,在运行时不可用。编译器知道变量将存储在哪里,并生成代码来访问该内存位置,而无需任何名称。
它们可能在程序文件的特殊调试部分可用,以允许调试器显示变量的值。
where is the type of the pointer stored?
它不是——类型也是静态的(除了与多态类类型关联的有限动态类型信息,但不是指针类型)。编译器知道类型,并生成代码以针对该类型以正确的方式访问存储的值。
Where is the type of this object stored?
如果类型是多态的(即,如果它是一个至少有一个虚函数的类类型),那么就会有一些静态数据,存储在一个你不能直接访问的未指定的地方, 来描述类型。将有足够的数据来支持虚函数调用(通常是指向最终覆盖的指针表)和 RTTI(供 dynamic_cast
使用的继承结构规范,以及 type_info
结构可通过 typeid
获得)。
否则,所有类型信息都是静态的。
Is [the compiled program] on the stack or the heap, or is this still another part of the memory?
在典型的计算机上,它位于静态内存中(代码 或文本部分),在程序启动时加载。在嵌入式系统上,它可能更永久地位于只读存储器中。
关于c++ - 堆栈/堆变量的变量/引用名称或类型存储在内存中的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27145372/