栈区和堆区

  注意,这里所说的堆区和栈区指的是(虚拟)内存区域,跟数据结构中的堆栈不一样。

栈区和堆区概念

  栈区(stack)—— 由编译器自动分配释放,存放局部变量的值、函数调用所需要维护的信息等。 栈区必须满足这样一条规则:先入栈的数据后出栈(First In Last Out, FILO)。

  堆区(heap)——一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收。在C/C++中,堆区一般是通过malloc/new来申请的。

  两者相同的一点就是它们都是分配在操作系统的虚拟内存中。

栈区和堆区区别

内存分配及释放

  栈区是由编译器自动分配释放。

  堆区一般是由程序员分配和释放。若程序员不释放,程序结束时可能由操作系统回收。

地址增长方式

  栈区总是向低地址增长。 压栈的操作使栈顶的地址减小,弹出的操作使栈顶地址增大。

  堆区总是向高地址增长。

申请大小的限制

  栈区是一段连续的内存区域,其大小是操作系统预先规定好的(如下Windows下可能是2M)。当申请的空间超过栈的剩余空间时,将会导致栈溢出,最终导致程序终止。因此,能从栈区获得的空间较小。

  堆区不一定是连续的内存区域(因为操作系统是用链表来存储空闲内存地址的),其大小受限于操作系统中有效的虚拟内存。因此,能从栈区获得的空间比较灵活,也比较大。

申请后系统的响应

  栈区:只要栈的剩余空间大于所申请空间,操作系统将为程序提供内存,否则将报异常提示栈溢出。
  堆区:操作系统有一个记录空闲内存地址的链表。当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。而且,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小。这样,代码中的free/delete语句才能正确的释放已申请的内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

申请效率的比较

  栈区由操作系统自动分配,速度较快。但程序员是无法控制的。
  堆区是由malloc/new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便。

可能会导致的问题

  栈区剩余空间不足时,会导致栈溢出。

  堆区的频繁申请和释放容易导致内存碎片。

参考资料

  堆和栈的区别(转过无数次的文章)

  What’s the difference between a stack and a heap?

时间: 2024-10-07 04:35:25

栈区和堆区的相关文章

浅析栈区和堆区内存分配的区别

以下是对栈区和堆区内存分配的区别进行了详细的分析介绍,需要的朋友可以过来参考下 一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上图可知,程序占用的内存被分了以下几部分. 1.栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们所说的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分

浅析栈区和堆区内存分配的区别(转)

以下是对栈区和堆区内存分配的区别进行了详细的分析介绍,需要的朋友可以过来参考下 一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上图可知,程序占用的内存被分了以下几部分. 1.栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们所说的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分

c语言—栈区,堆区,全局区,文字常量区,程序代码区 详解

转:http://www.cnblogs.com/xiaowenhui/p/4669684.html 一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.3.全局区(静态区)(static)-,全局

内存管理:栈区,堆区,全局区,文字常量区,程序代码区

一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 操作方式类似于数据结构中的栈. 2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(static)-,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变

数据区、代码区、栈区、堆区

简介 1.栈区(stack):由系统的编译器自动的释放,主要用来存放方法中的参数,一些临时的局部变量等,并且方法中的参数一般在操作完后,会由编译器自动的释放掉. 2.堆区(heap):由程序员决定,在Java中,如果程序员不释放的话,一般会由垃圾回收机制自动的清理掉.此区域主要用来存放我们经常创建的对象.动态的申请的临时空间等. 3.数据区(data seg):也称全局区或者静态区,根据名称我们就应该知道用来存放一些全局的东西,比如我们经常用到的静态变量.全局变量等都会存放到数据区,此区域上的东

转:计算机中栈区,堆区,静态存储区,文字常量存储区,代码区的详细解释

转:http://blog.csdn.net/dotneterbj/article/details/8021200 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事(数据结构中的堆是用数组模拟的),分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(

操作系统---栈区与堆区 转自:https://blog.csdn.net/amcp9/article/details/79597481

当一个程序运行时,其RAM存储方式是按照一定的区域划分的,以C为例 内存中的栈区处于相对较高的地址向较低的地址拓展,由操作系统决定的最高地址,所以它是一块连续的内存空间. 栈中分配局部变量空间,堆区是低地址向高地址拓展,用于分配程序员申请的内存空间.另外还有静态区是分配静态变量,全局变量空间的:只读区是分配常量和程序代码空间的:以及其他一些分区. 栈: 栈是为执行线程留出的内存空间.当函数被调用的时候,栈顶为局部变量和一些 bookkeeping 数据预留块.当函数执行完毕,块就没有用了,可能在

调试死机问题时可根据死机地址快速判断问题出在栈区还是堆区

先看一段会造成死机的代码及其运行结果: #include <iostream> using std::cout; using std::endl; using std::ostream; class Tree {   int height; public:   Tree(int treeHeight) : height(treeHeight) {     cout << __func__ << "(), this = " << this 

堆区、栈区和静态存储区详解

一.内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区.堆区和栈区.他们的功能不同,对他们使用方式也就不同. 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量. 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 堆区:亦称动态内存分配.程序在运行的时候用malloc或new申请任意大小的内存,程