黑马程序员技术交流社区

标题: 栈与堆的区别 [打印本页]

作者: 血马雄风    时间: 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