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的运行原理:
首先在一个最基本的方法中,应包含一些“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的内存玩法可以看字符串常量池的相关介绍。
标签: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