堆栈内存vs堆内存

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

我在C ++编程,我总是想知道什么是堆栈内存与堆内存。 我所知道的是当我打电话给新的时候,我会从堆中获得记忆。 如果如果创build本地variables,我会从堆栈中获取内存。 经过对互联网的一些研究,最常见的答案是堆栈内存是暂时的,堆内存是永久的。

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

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

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

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

谢谢

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

堆栈内存是通常的CPUdevise的结果。 它的分配/释放速度很快,因为它严格地是后进/先出devise。 堆栈寄存器上的移位操作和递减/递增操作很简单。

堆内存只是在程序加载和堆栈内存分配后留下的内存。 它可能(或可能不)包含全局variables空间(这是一个惯例)。

现代先进的多任务操作系统的虚拟内存和内存映射设备,使实际情况更加复杂,但简而言之,这是Stack vs Heap。

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

该堆栈就像std :: stack类一样,将参数推送到它上面,然后调用一个函数。 该函数然后知道它期望的参数可以在堆栈的末尾find。 同样,函数可以将本地人推入堆栈,并在从函数返回之前将其popup。 (警告 – 编译器优化和调用约定都意味着事情不是这么简单)

堆栈真的是最好的理解从低层次,我会推荐这个链接艺术组装 – 传递堆栈上的参数 。 很less有人会考虑从C ++进行任何手动堆栈操作。

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

堆内存就像rskar说的那样。 一般来说,在C ++中分配了新的对象,或者用malloc之类分配的内存块结束在堆上。 堆内存几乎总是必须手动释放,尽pipe你应该使用一个智能指针类或相似的,以避免需要记住这样做。 用完堆内存可能会(将?)导致一个std :: bad_alloc。

这是一种语言抽象 – 一些语言既有,也有一些,也有一些。

在C ++的情况下,代码不会在堆栈或堆中运行。 你可以通过重复调用new来分配循环中的内存,而不用调用delete来释放内存,从而testing堆内存不足的情况。 但是在做这个之前做一个系统备份