栈和堆

Posted Mune

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈和堆相关的知识,希望对你有一定的参考价值。

定义:两种抽象数据结构
        栈:先进后出 FILO
        堆:队列结构,先进先出; FIFO
操作系统:
        栈:由操作系统(编译器)自动分配,常用于局部变量,函数参数值,类似于操作系统中的栈FILO
        堆:由用户分配,若不主动释放,则最后由OS回收(Operating System),类似于链表


参考:http://www.cnblogs.com/munetiey/articles/6484537.html

       预备知识—程序的内存分配
              一个由C/C++编译的程序占用的内存分为以下几个部分
              1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。
              2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
              3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 - 程序结束后由系统释放。
              4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
              5、程序代码区—存放函数体的二进制代码。


例:

 1 //全局初始化区
 2 int a = 0;
 3 //全局未初始化区
 4 char* p1;
 5 
 6 
 7 void main()
 8 {
 9     int b;//
10     char s[] = "abc";//
11     char* p2;//
12     char* p3 = "1234";  //   1234/0 在常量区,p3在栈上
13     static int c = 0;//全局初始化区
14 
15     p1 = (char*)malloc(10);
16     p2 = (char*)malloc(20);
17     //分配得来的10和20字节在堆区
18 
19     strcpy(p1,"1234");//  1234/0在常量区,编译器可能会将它与p3所指向的1234/0优化成同一个地方
20 }

 

机制:
      栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将异常报栈溢出;
      堆:操作系统有一张记录空闲内存地址的链表,当用户申请时,遍历该链表,寻找第一个大于等于用户申请空间的堆结点;

限制:
      栈:栈是向低地址扩展的数据结构,是一块连续的内存区域,栈的大小有限制,一般为1M或2M
      堆:堆是向高地址扩展的数据结构,大小不受限制,由空闲地址组成的链表结构

效率:
      申请:栈比堆快
      存储读取:栈比堆快

存储内容:
      栈:在函数调用中,第一个进栈的是函数调用的下一个可执行语句的地址,然后是参数,然后是局部变量,静态变量不入栈
      堆:一般来说头部保存堆的长度大小,由用户指定

 

以上是关于栈和堆的主要内容,如果未能解决你的问题,请参考以下文章

栈和堆

数据结构中栈和堆---内存分配中栈和堆

为啥会有栈和堆?

为啥会有栈和堆?

栈和堆有什么不同之处

Java中栈和堆的区别