堆内存与堆内存

可能的复制品:
堆栈和堆 的位置和内容

我在用 C + + 编程,我总是想知道堆栈内存和堆内存到底是什么。我所知道的是,当我调用 new 时,我将从堆中获取内存。如果创建本地变量,我将从堆栈获取内存。经过对互联网的一些研究,最常见的答案是堆栈内存是临时的,堆内存是永久的。

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

堆栈和堆内存是对虚拟内存(可能在磁盘和 RAM 之间交换内存)的内存模型的抽象。所以堆栈和堆内存在物理上都可能是 RAM 或磁盘?那么堆分配似乎比堆栈分配慢的原因是什么呢?

还有,主程序是在堆栈中运行还是在堆中运行?

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

Thanks

168287 次浏览

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

对于 C + + ,代码既不在堆栈中运行,也不在堆中运行。通过重复调用 new在循环中分配内存,而不调用 delete释放内存,可以测试如果堆内存耗尽会发生什么情况。但是在这样做之前做一个系统备份.

堆栈内存是指可以通过 CPU 的堆栈寄存器访问的内存范围。堆栈被用来实现汇编语言中的“跳转-子程序”-“返回”代码模式,也被用来实现硬件级中断处理。例如,在中断期间,堆栈被用来存储各种 CPU 寄存器,包括 Status (表示操作的结果)和 Program Counter (中断发生时程序中的 CPU 在哪里)。

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

堆内存仅仅是程序加载并分配 Stack 内存后剩下的内存。它可能(也可能不)包含全局变量空间(这是一个约定问题)。

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

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

The stack is very much like the std::stack class: you push parameters onto it and then call a function. The function then knows that the parameters it expects can be found on the end of the stack. Likewise, the function can push locals onto the stack and pop them off it before returning from the function. (caveat - compiler optimizations and calling conventions all mean things aren't this simple)

从低层次来理解栈是最好的,我建议使用 组装艺术-在堆栈上传递参数。您很少会考虑从 C + + 进行任何类型的手动堆栈操作。

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

Heap memory is much as rskar says. In general, C++ objects allocated with new, or blocks of memory allocated with the likes of malloc end up on the heap. Heap memory almost always must be manually freed, though you should really use a smart pointer class or similar to avoid needing to remember to do so. Running out of heap memory can (will?) result in a std::bad_alloc.