堆栈内存与堆内存

Stack Memory vs Heap Memory

本文关键字:内存 堆栈      更新时间:2023-10-16

可能重复:
堆栈和堆栈是什么以及在哪里

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

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

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

此外,主程序将在堆栈中运行还是在堆中运行?

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

感谢

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

堆栈非常像std::stack类:将参数推到上面,然后调用一个函数。然后,函数知道它所期望的参数可以在堆栈的末尾找到。同样,函数可以将局部变量推送到堆栈上,并在从函数返回之前将它们从堆栈中弹出。(注意-编译器优化和调用约定都意味着事情并没有这么简单(

最好从低层次来理解堆栈,我建议您使用汇编艺术-在堆栈上传递参数。如果有的话,你很少会考虑从C++进行任何形式的手动堆栈操作。

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

堆内存就像rskar说的那样。一般来说,用new分配的C++对象,或者用malloc之类的方法分配的内存块最终都会出现在堆上。堆内存几乎总是必须手动释放的,尽管你真的应该使用智能指针类或类似的类来避免需要记住这样做。堆内存用完可能(会吗?(导致std::bad_alloc。

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

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

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

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

这是一种语言抽象——有些语言同时具有这两种语言,有些语言具有一种,有些语言两者都没有。

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