zoukankan      html  css  js  c++  java
  • C#之CLR内存原理初探

    C#之CLR内存原理初探

    投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-08-04 我要评论

    这篇文章主要介绍了C#之CLR内存原理初探,有助于读者进一步理解C#的运行原理,需要的朋友可以参考下
     

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

    首先我们看两个方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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的内存玩法可以看字符串常量池的相关介绍

  • 相关阅读:
    Java-继承,多态练习09-22-01
    Java-类与类之间的关系
    Java-继承 共3题
    设计模式-访问者模式
    设计模式-策略模式
    JAVA-初步认识-常用对象API(集合框架-List常用子类的特点)
    JAVA-初步认识-常用对象API(集合框架-ListIterator接口)
    JAVA-初步认识-常用对象API(集合框架-List集合的常用方法)
    JAVA-初步认识-常用对象API(集合框架-List和Set的特点)
    JAVA-初步认识-常用对象API(集合框架-迭代器的原理)
  • 原文地址:https://www.cnblogs.com/liyancheng/p/5406583.html
Copyright © 2011-2022 走看看