Stack Memory vs Heap Memory

25 浏览
0 Comments

Stack Memory vs Heap Memory

这个问题在这里已经有了答案

可能是重复的问题:

栈和堆是什么以及它们在哪里?

我正在使用C++编程,一直在想什么是栈内存和堆内存。 我知道的是,当我调用new时,我可以从堆中获得内存。如果我创建局部变量,则可以从栈中获得内存。经过一些网络研究,最常见的答案是栈内存是临时的,堆内存是永久的。

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

栈和堆内存是虚拟内存的内存模型的抽象(可能会在磁盘和RAM之间交换内存)。因此,栈和堆内存在物理上可能是RAM或磁盘?那么,堆分配为何似乎比栈内存分配慢?

此外,主要程序在栈或堆中运行?

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

谢谢

admin 更改状态以发布 2023年5月21日
0
0 Comments

堆栈内存特定是通过CPU的堆栈寄存器可访问的内存范围。堆栈用作汇编语言中实现“跳转-子程序”-“返回”代码模式的方式,也用作实现硬件级别中断处理的手段。举例来说,在中断期间,堆栈用于存储各种CPU寄存器,包括状态(指示操作结果)和程序计数器(当中断发生时CPU所在程序的位置)等。\n\n堆栈内存在通常的CPU设计中很重要。它的分配/释放速度很快,因为它是一个纯先进后出的设计。只需进行一次移动操作和堆栈寄存器的增减操作即可。\n\n堆内存简单地说就是程序加载和堆栈内存分配后剩余的内存空间。它可能(或可能不)包括全局变量空间(它是一种惯例)。\n\n现代的抢占式多任务操作系统和虚拟内存和内存映射设备使实际情况更加复杂,但这就是堆栈对比堆的简要概述。

0
0 Comments

在C++中,栈内存是局部变量存储/构造的位置。栈也用于保存传递给函数的参数。\n\n栈非常类似于std::stack类:您将参数推入堆栈,然后调用函数。函数将知道它所期望的参数可以在堆栈的末尾找到。同样,函数可以将局部变量推入堆栈中,并在从函数返回之前从堆栈中弹出它们。(警告 - 编译器优化和调用约定都意味着事情并不简单)\n\n从底层理解栈是最好的,我建议阅读《汇编艺术 - 在堆栈上传递参数》。从C++很少考虑手动堆栈操作。\n\n一般来说,栈是首选,因为它通常位于CPU缓存中,因此涉及存储在其中对象的操作往往更快。但是,栈是一种有限资源,不应用于任何大型任务。栈内存耗尽称为栈缓冲区溢出。这是一个严重的问题,但除非您有一个疯狂的递归函数或类似的东西,否则您真的不应该遇到这个问题。\n\n堆内存与rskar所说的非常相似。一般来说,使用new分配的C++对象,或使用类似malloc的内存块最终都会进入堆栈。堆内存几乎总是必须手动释放,但您真的应该使用智能指针类或类似的东西,以避免需要记得这样做。堆内存耗尽可能会(将?)导致std::bad_alloc。

0