[翻译]关于堆和堆栈

对于堆(heap)和堆栈(stack),尽管说过很多次,不过一直都不是很清楚。个人认为这篇帖子说的还是比较好懂的,便翻译了过来。有些地方可能不太准确,因此后面附上了原文。


堆栈用于存储临时值。当你调用一个函数时,n字节被分配到堆栈的顶层,其中n是所有局部变量的字节之和。一个用于标记自身的特殊函数所占用的区域,我们称之为堆栈帧。由于每个函数都可以调用其他函数,因此最终将会得到一连串的堆栈帧,每一个都会在另一个之上。当一个函数退出的时候,它的堆栈帧也被销毁,最后里面所有的东西都将丢失。

当你用完了堆栈空间的时候将会发生堆栈溢出。一般说来,当一个函数试图无限次的调用自身的时候会出现这种错误,因为这将导致无穷尽需要字节分配的堆栈帧。

堆基本上算是一个无尽的内存块(The Heap is basically a bottomless pool of memory)。只要你不确定什么时候需要一大块的内存(Whenever you need a chunk of memory for an indefinite amount of time),那么它将会从堆上分配。C#中的堆可能看起来更象堆栈一些,但是基于传统我们仍然称之为堆。

引用类型,比如我们所熟知的对象,它总是存储在堆里。没有方法可以将它存储于堆栈中。对它的引用或者指向它的指针可以被存储在堆栈里或者是另一个对象里。只要有至少一个引用指向它,那么它就将一直存在。

值类型,比如我们所熟知的结构,可以被存储在堆栈里或者是一个对象里。如果是在堆栈里,只要堆栈帧存在,它就将存在。

值类型可以被装箱(box)。这意味着程序试图将其作为引用类型并放入到堆中。

posted @ 2005-04-11 18:48    阅读(2186)  评论(1编辑  收藏  举报