堆栈内存vs堆内存
可能重复:
什么和堆栈和堆在哪里
我用C ++进行编程,我总是在想,堆栈内存和堆内存究竟是什么。 我所知道的是当我打电话给新的时候,我会从堆中获得记忆。 如果创建局部变量,我会从栈中获取内存。 在对互联网进行一些研究后,最常见的答案是堆栈内存是暂时的,堆内存是永久的。
堆栈和堆内存模型是操作系统还是计算机体系结构的概念? 所以有些可能不遵循堆栈和堆内存模型,或者它们都遵循它?
堆栈和堆内存是对虚拟内存的内存模型的抽象(可能会在磁盘和RAM之间交换内存)。 所以堆栈和堆内存物理上可能是内存或磁盘? 那么堆分配似乎比堆栈分配慢的原因是什么?
另外,主程序将在堆栈或堆中运行?
另外,如果一个进程用完堆栈内存或堆内存分配会发生什么?
谢谢
堆栈存储器特别是可通过CPU的堆栈寄存器访问的存储器范围。 堆栈被用作实现汇编语言中“跳转子程序” - “返回”代码模式的一种方式,并且也作为实现硬件级中断处理的手段。 例如,在中断期间,堆栈用于存储各种CPU寄存器,包括状态(表示操作结果)和程序计数器(中断发生时程序中的CPU在哪里)。
堆栈内存是通常CPU设计的结果。 其分配/取消分配的速度很快,因为它严格地是后进/先出设计。 堆栈寄存器上的移位操作和递减/递增操作很简单。
堆内存只是在程序加载和堆栈内存分配后留下的内存。 它可能(或可能不)包含全局变量空间(这是一个惯例)。
具有虚拟内存和内存映射设备的现代先发制人的多任务操作系统使实际情况更加复杂,但简而言之,这就是Stack vs Heap。
在C ++中,堆栈内存是局部变量被存储/构建的地方。 该堆栈还用于保存传递给函数的参数。
该堆栈就像std :: stack类一样,将参数推送到它上面,然后调用一个函数。 该函数然后知道它期望的参数可以在堆栈的末尾找到。 同样,该函数可以将本地人推入堆栈,并在从函数返回之前将其弹出。 (警告 - 编译器优化和调用约定都意味着事情并非如此简单)
该堆栈最好从低级别理解,我会推荐此链接装配的艺术 - 传递堆栈上的参数。 很少有人会考虑从C ++进行任何手动堆栈操作。
一般来说,堆栈是首选,因为它通常位于CPU高速缓存中,所以涉及存储在其上的对象的操作往往更快。 但是堆栈是一个有限的资源,不应该用于任何大的事情。 用尽堆栈内存称为堆栈缓冲区溢出。 遇到一件很严重的事情,但除非你有一个疯狂的递归函数或类似的东西,否则你真的不应该碰到它。
rskar说,堆内存很多。 一般来说,在分配了新内存的C ++对象中,或者使用malloc之类分配的内存块结束于堆中。 堆内存几乎总是必须手动释放,尽管您应该重新使用智能指针类或类似的内存以避免需要记住这样做。 用完堆内存可能会(将?)导致std :: bad_alloc。
这是一种语言抽象 - 一些语言既有,也有一种,有些则没有。
在C ++的情况下,代码不会在堆栈或堆中运行。 你可以通过重复调用new
来分配循环中的内存,而不用调用delete
来释放内存来测试堆内存用完的情况。 但是在做这件事之前做一个系统备份 。