[翻译]关于堆和堆栈
2005-04-11 18:48
281 查看
对于堆(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)。这意味着程序试图将其作为引用类型并放入到堆中。
堆栈用于存储临时值。当你调用一个函数时,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)。这意味着程序试图将其作为引用类型并放入到堆中。
相关文章推荐
- Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift
- 关于由CubeMx 生成stm32f4+freertos,不正常分析之堆栈大小设置
- [翻译]关于Mathematica提速的几点技巧(二)
- 关于“堆栈”
- 关于抽象与语言的翻译坑
- 关于DX多窗口编程的一篇翻译(感谢Happy_888网友给出的原文 ^_^)(转载)
- 关于计算机术语的几个翻译问题
- Cockroach Design 翻译 ( 二) 关于、概览
- 关于这段时间翻译的一点感悟
- 文献翻译第一篇——关于合成孔径雷达的数学指导
- 关于S40第五版SDK的一些说明(翻译)
- 关于EffectIve C++ 的总结(侯捷翻译版)
- MSDN关于RIL的翻译
- 关于性能测试RBI方法(翻译水平有限,如有错误麻烦能够指正)
- MSIL系列:关于Boxing和堆栈,栈的几个问题的回答
- C# 关于堆,堆栈的总结
- 关于堆栈的理解
- 关于翻译
- 【翻译自mos文章】关于分区索引:Global, Local, Prefixed and Non-Prefixed
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论(2) ambushaa [翻译] [转]