本帖最后由 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++, 都是要用到这个栈空间和堆空间的.
|