黑马程序员技术交流社区

标题: 关于堆和栈如何理解 [打印本页]

作者: Always.    时间: 2013-10-9 23:22
标题: 关于堆和栈如何理解
本帖最后由 Always. 于 2013-10-10 23:42 编辑

需要通俗易懂的说话,不要网上的copy。麻烦~
作者: Liu阳    时间: 2013-10-10 00:12
堆理解成程序员new出来的,栈就是系统分配的如常量.
作者: 念念念念_、    时间: 2013-10-10 10:16
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
作者: 祐掱緣    时间: 2013-10-10 13:17
栈— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
堆一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
收 。
作者: 荣右铭    时间: 2013-10-10 15:43
栈有点像酸菜坛子,腌酸菜的时候只能一层一层从下往上放白菜,吃的时候只能从上往下一层一层拿了吃,顺序是相反的,先进去的总是放在最后面,系统通过这种方式管理和使用重要变量的值。栈的资源总是很有限,至多不过几MB,因为不需要那么多,在内存中栈区和非栈区看起来没有什么区别,是系统设定的栈的高度。当我们把栈内堆积了太多东西,数据就有可能越过栈的最大高度,表现为数据覆盖了其他有用的代码区,程序崩溃,这就叫栈溢出。
堆可以比喻成一个零散货物的大仓库,一大堆东西怎么放都行,程序员需要自己构造链表和树结构来管理这些内存(如果需要管理的话),堆空间非常非常大,大到一般情况下你几乎不可能把它用完,编译器一般吧和前后顺序没有关系的变量和对象放在堆中,你声明一个对象,它的生存期是独立于其他变量的,它一般被放在堆中(就好像扔进去了),这依赖于编译器的具体设定,唯一能确定堆里东西的方法就是记录它的地址,如果地址丢了,这个堆中的对象就永远找不到了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2