A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Always. 中级黑马   /  2013-10-9 23:22  /  1503 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Always. 于 2013-10-10 23:42 编辑

需要通俗易懂的说话,不要网上的copy。麻烦~

评分

参与人数 1技术分 +1 收起 理由
茹化肖 + 1

查看全部评分

4 个回复

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