A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 陈君 金牌黑马   /  2014-8-5 17:20  /  1117 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

转自:http://www.jb51.net/article/53214.htm
本文初步讲述了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的运行原理:
首先在一个最基本的方法中,应包含一些“prologue"代码(不用我们管,编译自动生成的),负责在方法开始做它的工作之前进行初始化,还应有一些"epilogue"代码,负责在方法完成的时候进行清理,然后才返回调用者。M1开始是,它的"prologue"代码在线程栈上分配局部变量name的内存,它被负值了TOM,Tom这个字符串在字符串常量池。M1调用M2,将局部变量name作为一个实参来传递。这造成name局部变量中的地址被压入栈。在M2方法内部,将使用名为name2参数变量来标识栈位置。另外,调用一个方法时,还会将一个“返回地址”压入栈。被调用的方法在结束以后应该返回到这个位置(调用的位置)。
接着再来看看下图所示M2的运行原理:
M2的"prologue"代码为length和rate进行内存的分配,然后M2代码开始执行代码。最终,M2抵达它的return语句,造成CPU的指令指针被设置成栈中的返回地址(就说我们图中的{返回地址});
注:这里特别要提一下的说name2,name2在调用的时候已经变成参数压入了栈,所以这里只是对这里的地址进行重新指向,string的内存玩法可以看字符串常量池的相关介绍。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马