中堆和栈的区别图文解释

中堆和栈的区别图文解释

ID:34732857

大小:132.11 KB

页数:21页

时间:2019-03-10

中堆和栈的区别图文解释_第1页
中堆和栈的区别图文解释_第2页
中堆和栈的区别图文解释_第3页
中堆和栈的区别图文解释_第4页
中堆和栈的区别图文解释_第5页
资源描述:

《中堆和栈的区别图文解释》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、尽管在.NETframework下我们并不需要担心内存管理和垃圾回收(GarbageCollection),但是我们还是应该了解它们,以优化我们的应用程序。同时,还需要具备一些基础的内存管理工作机制的知识,这样能够有助于解释我们日常程序编写中的变量的行为。在本文中我将讲解栈和堆的基本知识,变量类型以及为什么一些变量能够按照它们自己的方式工作。在.NETframework环境下,当我们的代码执行时,内存中尽管在.NETframework下我们并不需要担心内存管理和垃圾回收(GarbageCollection),但是我们还是应该了解它们,以优化我们的应用程

2、序。同时,还需要具备一些基础的内存管理工作机制的知识,这样能够有助于解释我们日常程序编写中的变量的行为。在本文中我将讲解栈和堆的基本知识,变量类型以及为什么一些变量能够按照它们自己的方式工作。在.NETframework环境下,当我们的代码执行时,内存中有两个地方用来存储这些代码。假如你不曾了解,那就让我来给你介绍栈(Stack)和堆(Heap)。栈和堆都用来帮助我们运行代码的,它们驻留在机器内存中,且包含所有代码执行所需要的信息。* 栈vs堆:有什么不同?栈负责保存我们的代码执行(或调用)路径,而堆则负责保存对象(或者说数据,接下来将谈到很多关于堆的

3、问题)的路径。可以将栈想象成一堆从顶向下堆叠的盒子。当每调用一次方法时,我们将应用程序中所要发生的事情记录在栈顶的一个盒子中,而我们每次只能够使用栈顶的那个盒子。当我们栈顶的盒子被使用完之后,或者说方法执行完毕之后,我们将抛开这个盒子然后继续使用栈顶上的新盒子。堆的工作原理比较相似,但大多数时候堆用作保存信息而非保存执行路径,因此堆能够在任意时间被访问。与栈相比堆没有任何访问限制,堆就像床上的旧衣服,我们并没有花时间去整理,那是因为可以随时找到一件我们需要的衣服,而栈就像储物柜里堆叠的鞋盒,我们只能从最顶层的盒子开始取,直到发现那只合适的。[heapv

4、sstack1.gif]以上图片并不是内存中真实的表现形式,但能够帮助我们区分栈和堆。栈是自行维护的,也就是说内存自动维护栈,当栈顶的盒子不再被使用,它将被抛出。相反的,堆需要考虑垃圾回收,垃圾回收用于保持堆的整洁性,没有人愿意看到周围都是赃衣服,那简直太臭了!* 栈和堆里有些什么?当我们的代码执行的时候,栈和堆中主要放置了四种类型的数据:值类型(ValueType),引用类型(ReferenceType),指针(Pointer),指令(Instruction)。1.值类型:在C#中,所有被声明为以下类型的事物被称为值类型:bool byte char

5、 decimal double enum float int long sbyte short struct uint ulong ushort2.引用类型:所有的被声明为以下类型的事物被称为引用类型:class interface delegate object string3.指针:在内存管理方案中放置的第三种类型是类型引用,引用通常就是一个指针。我们不会显示的使用指针,它们由公共语言运行时(CLR)来管理。指针(或引用)是不同于引用类型的,是因为当我们说某个事物是一个引用类型时就意味着我们是通过指针来访问它的。指针是一块内存空间,而它指向另一个内

6、存空间。就像栈和堆一样,指针也同样要占用内存空间,但它的值是一个内存地址或者为空。[heapvsstack2.gif]4.指令:在后面的文章中你会看到指令是如何工作的...*如何决定放哪儿?这里有一条黄金规则:1. 引用类型总是放在堆中。(够简单的吧?)2. 值类型和指针总是放在它们被声明的地方。(这条稍微复杂点,需要知道栈是如何工作的,然后才能断定是在哪儿被声明的。)就像我们先前提到的,栈是负责保存我们的代码执行(或调用)时的路径。当我们的代码开始调用一个方法时,将放置一段编码指令(在方法中)到栈上,紧接着放置方法的参数,然后代码执行到方法中的被“压

7、栈”至栈顶的变量位置。通过以下例子很容易理解...下面是一个方法(Method):          publicintAddFive(intpValue)         {               intresult;               result=pValue+5;               returnresult;         }现在就来看看在栈顶发生了些什么,记住我们所观察的栈顶下实际已经压入了许多别的内容。首先方法(只包含需要执行的逻辑字节,即执行该方法的指令,而非方法体内的数据)入栈,紧接着是方法的参数入栈。(我们

8、将在后面讨论更多的参数传递)[heapvsstack3.gif]接着,控制(即执行方法的线程)

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。