【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的内存玩法可以看字符串常量池

posted @ 2014-07-31 15:44  Eric Guo  阅读(1116)  评论(4编辑  收藏  举报