关于c ++:堆栈内存与堆内存

Stack Memory vs Heap Memory

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What and where are the stack and heap

我正在用C++编程,我一直想知道堆栈内存和堆内存到底是什么。我只知道当我调用new时,我会从heap中获取内存。如果创建局部变量,我将从堆栈中获取内存。经过对因特网的研究,最常见的答案是栈内存是临时的,栈内存是永久的。

堆栈和堆内存模型是操作系统还是计算机体系结构的概念?所以其中一些可能不遵循堆栈和堆内存模型,或者所有的模型都遵循它?

堆栈和堆内存是对虚拟内存(可能在磁盘和RAM之间交换内存)的内存模型的抽象。那么堆栈和堆内存在物理上可能是RAM还是磁盘?那么,堆分配看起来比堆栈对应项慢的原因是什么呢?

另外,主程序将在堆栈或堆中运行?

另外,如果进程用完了分配的堆栈内存或堆内存,会发生什么情况?

谢谢


在C++中,堆栈内存是本地变量被存储/构造的地方。堆栈还用于保存传递给函数的参数。

堆栈类似于std::stack类,您将参数推送到它上面,然后调用一个函数。然后,函数知道它期望的参数可以在堆栈的末尾找到。同样,函数可以将局部变量推送到堆栈上,并在从函数返回之前将其弹出。(警告-编译器优化和调用约定都意味着事情不是那么简单)

从一个较低的层次上理解堆栈是最好的,我建议在堆栈上使用这种组装传递参数的链接技术。很少有人会考虑C++中的任何手工堆栈操作。

一般来说,堆栈是首选的,因为它通常在CPU缓存中,因此涉及存储在堆栈上的对象的操作往往更快。然而,堆栈是一个有限的资源,不应该用于任何大的资源。耗尽堆栈内存称为堆栈缓冲区溢出。这是一件很严肃的事情,但是除非你有一个疯狂的递归函数或者类似的东西,否则你真的不应该遇到一个。

堆内存正如rskar所说。一般来说,用新分配的C++对象或用MALOC分配的内存块最终堆起来。堆内存几乎总是必须手动释放,尽管您应该真正使用智能指针类或类似的类,以避免需要记住这样做。堆内存不足,会吗?导致std::bad_alloc。


堆栈内存是通过CPU的堆栈寄存器访问的内存范围。堆栈被用作在汇编语言中实现"跳转子例程"-"返回"代码模式的一种方法,也被用作实现硬件级中断处理的一种方法。例如,在中断期间,堆栈用于存储各种CPU寄存器,包括状态(指示操作结果)和程序计数器(中断发生时,程序中的CPU在哪里)。

堆栈内存在很大程度上是常规CPU设计的结果。它的分配/释放速度很快,因为它是严格的后进先出设计。这是一个简单的移动操作和堆栈寄存器上的减量/增量操作。

堆内存只是在程序加载和分配堆栈内存后剩余的内存。它可能(也可能不)包括全局变量空间(这是惯例问题)。

现代的具有虚拟内存和内存映射设备的先发制人的多任务操作系统使实际情况更加复杂,但简而言之,这就是堆栈与堆。


这是一种语言抽象——有些语言既有两种语言,也有一种语言,有些语言两者都没有。

在C++的情况下,代码不在堆栈中运行,也不在堆中运行。如果堆内存不足,可以通过重复调用new在循环中分配内存而不调用delete释放内存来测试会发生什么。但在执行此操作之前,请先备份系统。