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