内存来自于在没有new关键字的情况下初始化C ++对象?

时间:2016-02-05 19:17:28

标签: c++

考虑代码段:

ClassName* p;
p = new ClassName;

据我了解,我们正在从堆中分配内存以存储*p

但现在考虑:

ClassName C;

问题:如果不是来自堆,那么C的内存来自哪里?

2 个答案:

答案 0 :(得分:6)

  

据我所知,我们正在从堆中分配内存来存储   *p

措辞更正确,new创建的对象动态存储时间

  

如果不是来自堆,那么C的内存来自哪里?

自动存储时间

参见C ++标准§3.7/ 1。

谈论“堆栈”或“堆”会带您进入编译器实现级别。您通常不会对C ++编译器如何使不同类型的存储持续时间起作用感兴趣,但只对它们的语义感兴趣。

答案 1 :(得分:4)

  

问题:如果不是来自堆,那么C的内存来自哪里?

从堆栈(或者全局变量或函数'静态变量,来自静态分配的区域,独立于堆和堆栈)。

严格地说,C ++没有堆或堆栈的概念(除了作为标准库中的数据结构之外,它们与#34;"堆和堆栈基本不同,这是用于分配的流行机制通过运行程序的内存);没有指定分配和管理内存的确切机制。在实践中,程序在运行时在大多数系统上分配内存有两种方式:从堆(它本身构建在从操作系统获得的内存块上),或从堆栈(用于相同的堆栈)存储返回地址并在调用函数时保存临时值。

堆栈的内存通常在程序开始执行时(或之前)分配,通常需要连续。堆的内存通常是动态获取的,通常不需要连续(尽管实际上堆内存通常是以连续的块分配的。)

请注意您的第一个示例:

ClassName* p;
p = new ClassName;

...实际上包含两个分配:一个用于ClassName对象(动态存储,在堆上分配),另一个用于指针变量p(自动存储,在堆上分配)。

实际上,局部变量并不总是需要堆栈分配 - 它们的值有时可以保存在寄存器中(或者在某些情况下,存储可以完全优化掉,特别是如果值未使用或者是编译时常量)。理论上,堆分配也可能被优化掉。