C#之CLR内存原理初探

 更新时间:2014年08月04日 11:53:04   投稿:shichen2014  
这篇文章主要介绍了C#之CLR内存原理初探,有助于读者进一步理解C#的运行原理,需要的朋友可以参考下

本文初步讲述了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#中使用Oracle存储过程返回结果集的问题

    关于C#中使用Oracle存储过程返回结果集的问题

    Oracle中可以使用游标(Cursor)对数据集进行操作,但在存储过程输出参数中直接使用Cursor错误,下面小编给大家带来了C#中使用Oracle存储过程返回结果集的问题,感兴趣的朋友一起看看吧
    2021-10-10
  • C# 建造者模式(Builder Pattern)详细讲解

    C# 建造者模式(Builder Pattern)详细讲解

    建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示,它适用于构建过程复杂且涉及多个步骤的场景,本文介绍C# 建造者模式(Builder Pattern)详细讲解,感兴趣的朋友一起看看吧
    2025-03-03
  • C#中同步和异步回调的实现

    C#中同步和异步回调的实现

    在C#中,同步回调和异步回调都是用于处理任务或事件完成的机制,本文主要介绍了C#中同步和异步回调的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • 浅谈二叉查找树的集合总结分析

    浅谈二叉查找树的集合总结分析

    本篇文章是谈二叉查找树进行了详细的总结分析,需要的朋友参考下
    2013-05-05
  • C#使用HttpClient进行Post请求出现超时问题的解决及优化

    C#使用HttpClient进行Post请求出现超时问题的解决及优化

    最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也没有问题,那么问题就出在我的请求端了,所以本文给大家介绍了C# 使用HttpClient进行Post请求总是出现超时问题的优化,需要的朋友可以参考下
    2025-01-01
  • 解析Silverlight调用WCF/Rest异常的解决方法

    解析Silverlight调用WCF/Rest异常的解决方法

    本篇文章对Silverlight调用WCF/Rest异常的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#使用CDO发送邮件的方法

    C#使用CDO发送邮件的方法

    这篇文章主要介绍了C#使用CDO发送邮件的方法,涉及C#使用Windows COM组件实现邮件发送的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#实现合并多张图片为GIF动态图

    C#实现合并多张图片为GIF动态图

    这篇文章主要为大家详细介绍了C#如何将把一张又一张的图片去拼合成一张GIF动态图片,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-12-12
  • mvc开启gzip压缩示例分享

    mvc开启gzip压缩示例分享

    这篇文章主要介绍了mvc开启gzip压缩示例,需要的朋友可以参考下
    2014-03-03
  • C#之字符串截取--Regex.Match使用

    C#之字符串截取--Regex.Match使用

    这篇文章主要介绍了C#之字符串截取--Regex.Match使用解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05

最新评论