黑马程序员技术交流社区

标题: 简单解释下 栈和堆 的命名 [打印本页]

作者: zuochbd    时间: 2014-9-28 02:15
标题: 简单解释下 栈和堆 的命名
本帖最后由 caixingke 于 2014-9-28 02:21 编辑

栈和堆, 一向是一个大话题, 特别是初学者往往搞不懂这两者.IT行业纯粹是老米和老欧开创的, 教科书是他们写的, 名字是他们发明的, 标准是他们定的.
所以, 学计算机, 对概念的理解最好要多从英文的角度来理解.

栈(stack)还好理解, 大家知道它是FILO(first in, last out先进后出).
英文stack中的"st"常常表示一种"站立", 比如"stand""stage""stable"等等.
是一种整齐而有序的东西.
栈就是这种整齐而有序的东西.

但堆(heap)呢? 怎么理解?
以下的理解是我个人的理解.
heap, 即"堆", 垃圾堆的"堆". 垃圾堆成山, 我们去垃圾堆扔垃圾时, 都是随手扔过去的.
我们扔的垃圾停到何处? 这要靠运气! ----即, 我们程序员并不能控制这个对象要分在堆空间中的某个位置.
说得有点恶心了.
堆就是这种不整齐也无序的东西.
实际上, 这个对象要分配到堆空间的哪个位置, 是由操作系统的内存管理机制决定的(在Java里面, 应由java虚拟机由管理的吧).
这种内存管理机制有很多种, 最有名的运用得很广泛的一种是: 伙伴系统.

我想, 这大概就是 为什么要把那块内存命名为"heap"吧.
初学者, 特别是对计算机原理不懂的初学者, 可以这么看内存:
有一块整齐而有序的区域, 这块区域是栈空间. 函数中的局部变量就分在这个栈空间中, 一个函数执行完, 其中的局部变量空间就被撤消掉了.
有一块杂乱如山的区域, 这块区域是堆空间. 对象就是分在这个空间中的. 这个空间的对象具有全局作用域.
无论是java, 还是C/C++, 都是要用到这个栈空间和堆空间的.





作者: 朴日男    时间: 2014-9-28 02:50
比喻的好!!! 感谢,,,一直以为堆也是有顺序的 -0 - ...可否能讲讲 内部类和嵌套类和迭代器 在 内存中的表现???特想知道, 百度了也没看出所以然来,,,
类学到内部类和嵌套类 开始纠结了, 按毕老师的话就是"挂了" 囧,,,
作者: 阴有风    时间: 2014-9-28 09:12
JAVA中的内存管理是由JVM还完成的,不能手动的,不像C++中的指针那样灵活。C++的好处就是操作灵活,想怎么用就怎么用,不过也有危险的。JAVA的好处就是SUN提供了一些NB的类库,操作没有像C++那样灵活,不能手动,只能由系统来搞定。堆就是放变量的,在编译时就已经确定的,栈就是在动行是向内存中申请的内存空间。明白了不。。。听说过多肽吧。多肽分为编译时多肽和运行时多肽。编译时多肽相当于堆。运行时多肽相当于栈
作者: 不系之舟王    时间: 2014-9-28 09:16
解释的不错
作者: zuochbd    时间: 2014-9-28 12:57
朴日男 发表于 2014-9-28 02:50
比喻的好!!! 感谢,,,一直以为堆也是有顺序的 -0 - ...可否能讲讲 内部类和嵌套类和迭代器 在 内存中的表现? ...

我其实有发过一个关于 内部类 的贴子. 无奈没人理. 可能是我写的东西太晦涩了, 看起来比较累吧. 改天我修改下.
作者: 阴有风    时间: 2014-9-29 08:16
解释的更加简单独到
作者: sk0806    时间: 2014-9-29 08:20
不错,顶楼主,懂了




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