存储在堆栈/堆变量的内存中的变量/引用名称或类型在哪里?

时间:2014-11-26 09:23:25

标签: c++ memory stack heap variable-names

我想我理解堆栈和堆栈之间的主要区别。

在以下程序中,在堆上创建大小为n的Object。在堆栈上创建一个指向这个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)我知道编译后的程序也驻留在某个地方的内存中以指导它的执行。这是在堆栈还是堆上,还是这仍然是内存的另一部分?

3 个答案:

答案 0 :(得分:7)

  

名称p和r存储在哪里?

它们不是 - 变量名称是静态的,并且在运行时不可用。编译器知道变量的存储位置,并生成代码以访问该内存位置而无需任何名称。

它们可能在程序文件的特殊调试部分中可用,以允许调试器显示变量的值。

  

指针存储的类型在哪里?

不是 - 类型也是静态的(除了与多态类类型相关的有限动态类型信息,但不是指针类型)。编译器知道类型,并生成代码以正确的方式访问存储的值。

  

此对象的类型存储在哪里?

如果类型是多态(即,如果它是具有至少一个虚函数的类类型),则会有一些静态数据存储在未指定的位置,您无法直接访问,来描述类型。将有足够的数据来支持虚函数调用(通常是指向最终覆盖的指针表)和RTTI(由dynamic_cast使用的继承结构的规范,以及type_info结构可通过{ {1}})。

否则,所有类型信息都是静态的。

  

[编译后的程序]是在堆栈还是堆上,还是这仍然是内存的另一部分?

在典型的计算机上,它位于静态存储器(代码文本部分)中,在程序启动时加载。在嵌入式系统上,它可能会更永久地位于只读存储器中。

答案 1 :(得分:3)

  

因为引用不使用额外的内存,所以不再分配内存

如何在C ++标准中指定实现引用,但大多数编译器都会像指针一样实现它们,因此在未经优化的代码中,r可能是另外4个字节(在您的系统上) ....

  

名称p和r存储在哪里

     

这里是存储指针的类型吗?

     

存储[r]的类型在哪里

它们在运行时存在于编译器本身内部,并且可能在一些调试符号信息中放入生成的对象/库/程序中,以帮助交互式调试,如果您使用例如GCC的g++ -g选项,但它们不会通过普通的C ++程序语句存储或访问。

  

我知道编译后的程序也驻留在某个地方的内存中以指导它的执行。这是在堆栈还是堆上,还是这仍然是内存的另一部分?

编译后的程序是一堆二进制数据和机器代码操作码(数字),操作系统知道如何加载并要求CPU解释和执行。那个数据通常不在堆栈上,也不在堆中,而是混合了未初始化数据",#34;初始化数据"和#34;代码"操作系统安排的段/区域。

答案 2 :(得分:1)

计算机永远不会知道p和r。 变量名用于提高高级语言的可读性。 例如,您可以通过

获取汇编代码
gcc -S -c code.c

代码中没有p和r。