栈和堆
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
堆:堆是向高地址扩展的数据结构,大小不受限制,由空闲地址组成的链表结构
效率:
申请:栈比堆快
存储读取:栈比堆快
存储内容:
栈:在函数调用中,第一个进栈的是函数调用的下一个可执行语句的地址,然后是参数,然后是局部变量,静态变量不入栈
堆:一般来说头部保存堆的长度大小,由用户指定
以上是关于栈和堆的主要内容,如果未能解决你的问题,请参考以下文章