考虑代码段:
ClassName* p;
p = new ClassName;
据我了解,我们正在从堆中分配内存以存储*p
。
但现在考虑:
ClassName C;
问题:如果不是来自堆,那么C
的内存来自哪里?
答案 0 :(得分:6)
据我所知,我们正在从堆中分配内存来存储
*p
。
措辞更正确,new
创建的对象动态存储时间。
如果不是来自堆,那么
C
的内存来自哪里?
自动存储时间。
参见C ++标准§3.7/ 1。
谈论“堆栈”或“堆”会带您进入编译器实现级别。您通常不会对C ++编译器如何使不同类型的存储持续时间起作用感兴趣,但只对它们的语义感兴趣。
答案 1 :(得分:4)
问题:如果不是来自堆,那么C的内存来自哪里?
从堆栈(或者全局变量或函数'静态变量,来自静态分配的区域,独立于堆和堆栈)。
严格地说,C ++没有堆或堆栈的概念(除了作为标准库中的数据结构之外,它们与#34;"堆和堆栈基本不同,这是用于分配的流行机制通过运行程序的内存);没有指定分配和管理内存的确切机制。在实践中,程序在运行时在大多数系统上分配内存有两种方式:从堆(它本身构建在从操作系统获得的内存块上),或从堆栈(用于相同的堆栈)存储返回地址并在调用函数时保存临时值。
堆栈的内存通常在程序开始执行时(或之前)分配,通常需要连续。堆的内存通常是动态获取的,通常不需要连续(尽管实际上堆内存通常是以连续的块分配的。)
请注意您的第一个示例:
ClassName* p;
p = new ClassName;
...实际上包含两个分配:一个用于ClassName
对象(动态存储,在堆上分配),另一个用于指针变量p
(自动存储,在堆上分配)。
实际上,局部变量并不总是需要堆栈分配 - 它们的值有时可以保存在寄存器中(或者在某些情况下,存储可以完全优化掉,特别是如果值未使用或者是编译时常量)。理论上,堆分配也可能被优化掉。