c++ - 堆栈/堆变量的变量/引用名称或类型存储在内存中的什么位置?

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

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

在下面的程序中,在堆上创建了一个大小为 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/

相关文章:

c++ - 定义一个结构体中没有默认构造函数的类

c - 如何计算C中的内存消耗

java - 如何使 Java 应用程序的内存高效?

c - 分配内存的地址取决于什么?

带有 GSON 的 Java 堆空间

linux - 如何确定进程的内存量?

c++ - 表示简单电路时的最佳数据结构 - C++

c++ - OpenCV:合并重叠的矩形

c++ - 如何使用带有覆盆子相机模块的opencv c++以彩色模式获取图像

java - 在java中使用大内存的最佳实践是什么?