欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#之CLR内存原理初探

程序员文章站 2023-12-17 22:14:58
本文初步讲述了c#的clr内存原理。这里所关注的内存里面说没有寄存器的,所以我们关注的只有托管堆(heap),栈(stack), 字符串常量池(其中string是一个很特殊...

本文初步讲述了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内存原理初探

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

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

C#之CLR内存原理初探

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

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

上一篇:

下一篇: