【C#】CLR内存那点事(初级)_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 【C#】CLR内存那点事(初级)

【C#】CLR内存那点事(初级)

 2014/7/31 21:17:53  Eric Guo  程序员俱乐部  我要评论(0)
  • 摘要:最近回头看了一下书,对内存的理解又有新的认识。我所关注的内存里面说没有寄存器的,所以我关注的只有托管堆(heap),栈(stack),字符串常量池(string是一个很特殊的对象)首先我们看两个方法:voidM1(){stringname="Tom";M2(name);}voidM2(stringname2){intlength=10;doublerate=10.0;name2="Joe";return;}这里我们有一个M1的方法,初始化一个name局部变量,然后调用M2...........
  • 标签:C# 内存

最近回头看了一下书,对内存理解又有新的认识。我所关注的内存里面说没有寄存器的,所以我关注的只有 托管堆(heap),栈(class="hps">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的内存玩法可以看字符串常量池

发表评论
用户名: 匿名