如果没有新的关键字,内存来自哪里来初始化C++对象?

如果没有新的关键字,内存来自哪里来初始化C++对象?,c++,C++,考虑代码片段: ClassName* p; p = new ClassName; 据我所知,我们正在从堆中分配内存来存储*p 但现在考虑一下: ClassName C; 问:如果不是从堆中,那么C的内存来自哪里 问:如果不是从堆中,那么C的内存来自哪里 来自堆栈,或者如果是全局变量或函数“static”变量,则来自独立于堆和堆栈的静态分配区域 严格地说,C++除了标准库中的数据结构之外,没有堆或栈的概念,这与堆和栈之间的根本不同,它们是用于运行程序分配内存的普遍机制;没有指定内存分配和管理的

考虑代码片段:

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

但现在考虑一下:

ClassName C;
问:如果不是从堆中,那么C的内存来自哪里

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

来自堆栈,或者如果是全局变量或函数“static”变量,则来自独立于堆和堆栈的静态分配区域

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

堆栈的内存通常在程序开始执行时分配,并且通常需要是连续的。堆的内存通常是动态获取的,通常不需要是连续的,尽管在实践中,堆内存通常是在连续的块中分配的

请注意,您的第一个示例:

ClassName* p;
p = new ClassName;
。。。实际上包含两种分配:一种是在堆上分配给ClassName对象动态存储,另一种是在堆上分配给指针变量p automatic storage

在实践中,局部变量并不总是需要堆栈分配——它们的值有时可以保存在寄存器中,或者在某些情况下,可以完全优化存储,特别是当值未使用或是编译时常量时。从理论上讲,堆分配也可以进行优化

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

更准确地说,new创建的对象具有动态存储持续时间

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

它具有自动存储时间

<参见C++标准〉3.7/1。


讨论堆栈或堆会让您了解编译器实现级别。一般来说,C++编译器对不同类型的存储持续时间的工作不感兴趣,但只对它们的语义感兴趣。

这似乎是一个非常懒惰的问题。没有研究。看看C++是否从幕后堆中获得堆栈的内存?@乔治,这就是你要找出的东西。乔治:不,不是真的。堆栈对于在CPU上运行的程序来说是一种固定大小的有限资源。@George堆栈通常不被视为堆的一部分,不。但是,最终,程序的所有内存通常由操作系统提供,有时获取堆栈内存的方式与获取堆内存的方式类似。尽管有一些重要的区别;堆栈必须是连续的。@如果您没有操作系统,但在裸机上操作,该怎么办?它没有从C++标准中指定,也不需要。似乎不知道栈/堆概念的人不太可能阅读C++标准。回答得很好。@erip:好吧,所有的问题和答案都要让全世界看到:这说明了函数和块作用域变量可能有堆栈,全局变量可能有其他内存。