加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:10:51 所属栏目:百科 来源:网络整理
导读:我想我理解堆栈和堆栈之间的主要区别. 在以下程序中,在堆上创建大小为n的Object.在堆栈上创建一个指向这个sofar无名对象的指针p,它占用4个字节(至少在我的系统上).如果我理解得很好,因为引用不使用额外的内存,不会分配更多的内存(除了堆栈上的main()返回的in
我想我理解堆栈和堆栈之间的主要区别.

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

解决方法

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使用的继承结构的规范,以及通过typeid可用的type_info结构).

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

Is [the compiled program] on the stack or the heap,or is this still another part of the memory?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读