C#之CLR内存原理初探

作者:shichen2014 时间:2023-02-16 00:58:09 

本文初步讲述了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的内存玩法可以看字符串常量池的相关介绍。

标签:C#,CLR,内存,原理
0
投稿

猜你喜欢

  • Spring Boot FeignClient 如何捕获业务异常信息

    2022-01-26 11:57:41
  • 批处理一键安装JDK/一键安装JRE和自动配置Java环境变量

    2023-11-29 05:28:30
  • Android Intent实现页面跳转的两种方法

    2022-03-13 22:27:10
  • Spring IOC与DI核心重点分析

    2023-11-12 14:35:55
  • C# Resources资源详解

    2021-10-13 02:49:32
  • 一文讲通Java为什么不支持多继承原理

    2023-09-28 23:32:50
  • Android编程实现简单文件浏览器功能

    2022-01-02 06:13:46
  • Android从服务器获取图片的实例方法

    2022-08-27 04:03:46
  • Android实现为Notification加上一个进度条的方法

    2022-12-14 00:39:01
  • Java实现求数组最长子序列算法示例

    2023-09-28 12:35:14
  • Java编程中使用XFire框架调用WebService程序接口

    2023-11-06 20:16:33
  • Android开发之资源文件用法实例总结

    2023-05-13 06:02:39
  • SpringCloud使用Zookeeper作为注册中心

    2023-11-21 20:28:20
  • java多线程中的异常处理机制简析

    2021-11-18 01:54:39
  • c#获取数组中最大数的值

    2022-07-20 07:49:02
  • 如何用C#找出数组中只出现了一次的数字

    2021-06-15 15:42:56
  • Java实现读写文件功能的代码分享

    2023-02-07 04:07:02
  • Android获取SHA1的方法

    2022-11-18 20:55:12
  • SpringBoot自动装配原理详解

    2023-07-26 08:44:46
  • Android使用友盟集成QQ、微信、微博等第三方分享与登录方法详解

    2022-03-07 01:46:30
  • asp之家 软件编程 m.aspxhome.com