现在的位置: 首页 > 综合 > 正文

初读CLR Via C# 之 堆栈

2011年09月29日 ⁄ 综合 ⁄ 共 1068字 ⁄ 字号 评论关闭

在文章的开头,我要感谢博客园的各位看官对小弟的上一篇文章的支持。

就像有网友说的一样,这本书的前三章确实比较难懂,需要用心和反复的去读并揣摩(当然,不要去痴迷)在进行下一章内容前(由于笔者水平有限,还没有完全理解,故本章不会进行讲述),我想先说个基本概念,什么是堆栈?(有点新瓶装老酒的感觉,但是理解堆栈真的很重要)

首先,我们要非常的清楚堆和栈是两个不同的概念(尽管我们经常把堆栈一起说)在C#中,我们把引用类型放在堆中,把值类型放在栈中(如果对值类型和引用类型不是很明白,请百度或者google,笔者就不在这里做解释了,望海涵)堆和栈的区别在于,堆是由系统自动分配的,而且系统不去释放,需要我们自己手动释放,虽然现在在C#中有垃圾回收机制,但是在我们手动调用GC.Collect()方法之后,我们需要知道需要马上做强制回收的引用类型的代是多少,笔者觉得还不如在一个窗体关闭之后进行Dispose()一下来的实在,如果在一个大系统中,经常出现内存溢出的异常而导致系统崩溃,各位看官就需要注意是否释放了消耗的内存(虽然说有的看官觉得直接赋值为null也可以,但是笔者在工作中遇到过问题,就是说在把项目编译成debug的时候赋值为null内存确实降低了,但是发布出去的项目编译成Release模式效果不大,真的不知道是因为什么,如果有人知道的话一定要告诉我,笔者将非常感激)。然而栈上分配的内存,系统会自动释放并且它是由系统静态分配的。在栈运行时,我们称之为堆栈。

那么堆栈的结构特点是什么呢?给大家打个比方吧,我们可以把堆栈比喻成我们在做化学试验的一个试管,而我们的那些数据比喻成有编号的玻璃球,从12……10进行编号,接着,我们把玻璃球从1号开始按顺序放入试管内,那我们如何取出编号为1的球呢?没错,要从第10个开始取,取到编号为1的球为止。这就是堆栈的先进后出的一个结构特点。

在实际的工作中,堆栈依旧是先进后出。堆栈会在内存中开辟一个存储区域,而我们需要的数据有序的一个一个的压入到存储区域中,在数据有序的进入到存储区域的同时,会有一个地址指针,而这个地址指针总是指向最后一个进入存储区域的数据。每一个进入存储区域的数据,我们可以称之为单元,在第一个数据单元被压入存储空间之后后一个数据单元在前一个数据单元相连的后面一个空间中进行存储,以此类推。而地址之后自动指向刚进入存储区域的数据单元,同样,当最后一个数据单元被取出后,地址指针向前移一位。

 

以上为笔者对堆栈的理解,可能理解的不是很透彻,还望给位高手能给与纠正,对笔者也是一个提高。

抱歉!评论已关闭.