黑马程序员技术交流社区
标题:
栈与堆的区别
[打印本页]
作者:
血马雄风
时间:
2015-8-23 08:26
标题:
栈与堆的区别
一、程序所占用内存的分类
1、栈区(stack):由编译器自动分配和释放。存放函数的参数值、局部变量值等。
操作方式类似数据结构的中的栈。
2、堆区(heap):由程序员分配和释放(程序员不释放,程序结束时由os释放)。其与数据结构中的堆使两回事。操作方式类似链表。
3、全局区(静态区)(static):全局变量与静态变量存放在一块。程序结束后由系统释放。
4、文字常量区:存放常量字符串。程序结束后由系统释放。
5、程序代码区:存放函数体的二进制代码。
二、栈与堆的区别
1、数据结构上的栈与堆
1)栈:一种“后进先出”性质的数据结构。
2)堆:一种经过排序的树形数据结构。
3)程序的栈与堆和数据结构上的栈与堆有所区别。
1、申请与回收方式
1)栈:由系统自动分配和回收。例如:int b;
2)堆:程序员自己申请,手动回收(C的free(),C++的delete),JAVA虚拟机自动回收。例如:p = new Font();
//p在栈区,new Font()在堆区(C中的molloc()函索有此功能)
2、大小限制和响应
1)栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存空间,最大空间为2M。申请后,只有栈的剩余空间大于所申请空间,系统为程序提供内存。如果申请的空间超过栈的剩余空间,将会提示overflow。
2)堆:堆是向高地址扩展的数据结构,是一块不连续的内存空间,其空间大小受限于计算机系统中有效的虚拟内存。因此,堆获得的空间比较灵活,且较大。申请后,程序首先遍历一个链表(该链表记录空闲内存地址),直到找到第一个空间大于所申请空间的堆。
3、申请速度
1)栈:速度块,但程序员无法控制。
2)堆:速度较慢,且容易产生内存碎片,不过用起来方便。
4、存储内容
1)栈:首先是函数调用后的下一条指令(函索调用语句的下一条可执行语句)的地址,然后是函索的各个参数(由右往左入栈),最后是函数的局部变量。
2)堆:由程序员安排。
作者:
zhao1991
时间:
2015-8-23 08:45
不错,值得一看
作者:
gaoyintong
时间:
2015-8-23 08:46
总结的很详细
作者:
迷途羔羊
时间:
2015-8-23 09:00
又学到知识l,赞一个
作者:
fantianfei
时间:
2015-8-23 09:04
分享了。。
作者:
cc3441251
时间:
2015-8-23 09:07
学习了,谢谢分享
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2