手机
当前位置:查字典教程网 >编程开发 >C#教程 >C#之CLR内存原理初探
C#之CLR内存原理初探
摘要:本文初步讲述了C#的CLR内存原理。这里所关注的内存里面说没有寄存器的,所以我们关注的只有托管堆(heap),栈(stack),字符串常量池...

本文初步讲述了C#的CLR内存原理。这里所关注的内存里面说没有寄存器的,所以我们关注的只有托管堆(heap),栈(stack), 字符串常量池(其中string是一个很特殊的对象)

首先我们看两个方法:

void M1() { string name = "Tom"; M2(name); } void M2(string name2) { int length = 10; double rate = 10.0; name2 = "Joe"; return; }

这里我们有一个M1的方法,初始化一个name局部变量,然后调用M2..............

如下图所示先来看看M1的运行原理:

C#之CLR内存原理初探1

首先在一个最基本的方法中,应包含一些“prologue"代码(不用我们管,编译自动生成的),负责在方法开始做它的工作之前进行初始化,还应有一些"epilogue"代码,负责在方法完成的时候进行清理,然后才返回调用者。M1开始是,它的"prologue"代码在线程栈上分配局部变量name的内存,它被负值了TOM,Tom这个字符串在字符串常量池。M1调用M2,将局部变量name作为一个实参来传递。这造成name局部变量中的地址被压入栈。在M2方法内部,将使用名为name2参数变量来标识栈位置。另外,调用一个方法时,还会将一个“返回地址”压入栈。被调用的方法在结束以后应该返回到这个位置(调用的位置)。

接着再来看看下图所示M2的运行原理:

C#之CLR内存原理初探2

M2的"prologue"代码为length和rate进行内存的分配,然后M2代码开始执行代码。最终,M2抵达它的return语句,造成CPU的指令指针被设置成栈中的返回地址(就说我们图中的{返回地址});

注:这里特别要提一下的说name2,name2在调用的时候已经变成参数压入了栈,所以这里只是对这里的地址进行重新指向,string的内存玩法可以看字符串常量池的相关介绍。

【C#之CLR内存原理初探】相关文章:

C# 批处理调用方法

深入C# 内存管理以及优化的方法详解

深入多线程之:内存栅栏与volatile关键字的使用分析

C#中fixed关键字的作用总结

C#零基础学习理解委托

C# 面向对象的基本原则

设置C#窗体程序只能启动一次

C#中静态的深入理解

分享C#操作内存读写方法的主要实现代码

C#生成影像金字塔的原理实例

精品推荐
分类导航