C#中堆和栈的区别分析

C#中堆和栈的区别分析

ID:40543344

大小:77.23 KB

页数:23页

时间:2019-08-04

C#中堆和栈的区别分析_第1页
C#中堆和栈的区别分析_第2页
C#中堆和栈的区别分析_第3页
C#中堆和栈的区别分析_第4页
C#中堆和栈的区别分析_第5页
资源描述:

《C#中堆和栈的区别分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、线程堆栈:简称栈Stack托管堆:简称堆Heap使用.Net框架开发程序的时候,我们无需关心内存分配问题,因为有GC这个大管家给我们料理一切。如果我们写出如下两段代码:代码段1:publicintAddFive(intpValue){intresult;result=pValue+5;returnresult;}线程堆栈:简称栈Stack托管堆:简称堆Heap使用.Net框架开发程序的时候,我们无需关心内存分配问题,因为有GC这个大管家给我们料理一切。如果我们写出如下两段代码:代码段1:publicintAddFive(intpValue){intresult;resul

2、t=pValue+5;returnresult;}代码段2:publicclassMyInt{publicintMyValue;}publicMyIntAddFive(intpValue){MyIntresult=newMyInt();result.MyValue=pValue+5;returnresult;}问题1:你知道代码段1在执行的时候,pValue和result在内存中是如何存放,生命周期又如何?代码段2呢?要想释疑以上问题,我们就应该对.Net下的栈(Stack)和托管堆(Heap)(简称堆)有个清楚认识,本立而道生。如果你想提高程序性能,理解栈和堆,必须的!

3、本文就从栈和堆,类型变量展开,对我们写的程序进行庖丁解牛。C#程序在CLR上运行的时候,内存从逻辑上划分两大块:栈,堆。这俩基本元素组成我们C#程序的运行环境。一,栈vs堆:区别?栈通常保存着我们代码执行的步骤,如在代码段1中AddFive()方法,intpValue变量,intresult变量等等。而堆上存放的则多是对象,数据等。(译者注:忽略编译器优化)我们可以把栈想象成一个接着一个叠放在一起的盒子。当我们使用的时候,每次从最顶部取走一个盒子。栈也是如此,当一个方法(或类型)被调用完成的时候,就从栈顶取走(calledaFrame,译注:调用帧),接着下一个。堆则不然

4、,像是一个仓库,储存着我们使用的各种对象等信息,跟栈不同的是他们被调用完毕不会立即被清理掉。如图1,栈与堆示意图(图1)栈内存无需我们管理,也不受GC管理。当栈顶元素使用完毕,立马释放。而堆则需要GC(Garbagecollection:垃圾收集器)清理。二,什么元素被分配到栈?什么被分配到堆?当我们程序执行的时候,在栈和堆中分配有四种主要的类型:值类型,引用类型,指针,指令。值类型:在C#中,继承自System.ValueType的类型被称为值类型,主要有以下几种(CLR2.0中支持类型有增加):*bool*byte*char*decimal*double*enum*f

5、loat*int*long*sbyte*short*struct*uint*ulong*ushort引用类型:以下是引用类型,继承自System.Object:*class*interface*delegate*object*string指针:在内存区中,指向一个类型的引用,通常被称为“指针”,它是受CLR(CommonLanguageRuntime:公共语言运行时)管理,我们不能显示使用。需要注意的是,一个类型的引用即指针跟引用类型是两个完全不同的概念。指针在内存中占一块内存区,它本身只代表一个内存地址(或者null),它所指向的另一块内存区才是我们真正的数据或者类型。

6、如图2:(图2)指令:后文对指令再做介绍。三,如何分配?我们先看一下两个观点:观点1,引用类型总是被分配在堆上。(正确?)观点2,值类型和指针总是分配在被定义的地方,他们不一定被分配到栈上。(这个理解起来有点难度,需要慢慢来)上文提及的栈(Stack),在程序运行的时候,每个线程(Thread)都会维护一个自己的专属线程堆栈。当一个方法被调用的时候,主线程开始在所属程序集的元数据中,查找被调用方法,然后通过JIT即时编译并把结果(一般是本地CPU指令)放在栈顶。CPU通过总线从栈顶取指令,驱动程序以执行下去。下面我们以实例来详谈。还是我们开篇所列的代码段1:publici

7、ntAddFive(intpValue){intresult;result=pValue+5;returnresult;}当AddFive方法开始执行的时候,方法参数(parameters)则在栈上分配。如图3:(图3)注意:方法并不在栈中存活,图示仅供参考。接着,指令指向AddFive方法内部,如果该方法是第一次执行,首先要进行JIT即时编译。如图4:(图4)当方法内部开始执行的时候,变量result被分配在栈上,如图5:(图5)方法执行完毕,而且方法返回后,如图6所示:(图6)在方法执行完毕返回后,栈上的区域被清理。如图7

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

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

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