Net运时的相互关系.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Net运时的相互关系

HYPERLINK /enshjiang/archive/2012/02/16/2353599.html Net运行时的相互关系 ?? ? ?阅读目录 前言 线程堆栈的分配 托管堆上对象的分配 结束语 ? 前言   .Net中的运行时,以及各个类型、对象、线程堆栈以及托管堆之间的关系,在初学者(俺是初学者中的菜鸟 J)看来,有很多是难以理解的东西,俺在看了CLR Via C# 的前几章后,现在将文中的大概意思并加以自己的理解,重现运行时,以及各个关系。希望各位尽量拍砖,多多指出不正确的地方,共同进步。 ?线程堆栈的分配 ? ???????? 图1中展示了CLR加载的一个Microsoft Windows进程。在一个进程中,可能会存在多个线程。在创建一个线程时,这个线程会分配到一个1MB大小的堆栈。这个堆栈空间的作用:用于向方法传递实参,并用于存储在方法内部定义的局部变量。图1展示了一个线程的堆栈(右侧)。堆栈都是从高位内存向地位内存地址构建。在左侧图中,该线程执行了一些代码,它的堆栈上已经有一些数据(右图上半部分灰色区域)。现在假定线程要执行M1方法。? ???????? 在一个方法中,应该包含一些开场白代码,负责在方法开始前对变量进行初始化操作,以及一些收场白代码,负责方法执行完毕之后进行清理工作,以便返回调用者。当M1方法开始执行时,它的开场白代码在线程的对战中为局部变量name分配内存,如图2所示:? 接着,M1中的代码执行,调用M2方法,将局部变量name作为一个实参来传递。这造成name局部变量中的地址被压入堆栈。在M2方法内部,将使用名为s的形参变量来标识堆栈位置(注意,有的架构通过寄存器来传递实参以提升性能,但这对于当前的讨论来说并不重要)。另外,在调用一个方法时,还会将一个“返回地址”压入堆栈。以便被调用的方法在完成之后,应该返回到这个位置。参见图3:? ???????? M2方法开始执行时,他的开场白代码在线程的堆栈中为局部变量length 和tally分配内存,如图4。然后,开始执行M2方法内部的代码。最终,M2会执行到return语句,这时CPU执行指针会被设置成堆栈中刚才存储的[返回地址] ,而且M2的堆栈帧会进行辗转开解(unwind)(个人大概理解意思是:释放M2的内部局部变量),然后堆栈内部会恢复到图2状态,之后,M1将继续执行后面代码,最终M1也会返回到它的调用者,这个过程其实跟M2是一样的,M1执行完成之后,M1的堆栈帧会进行辗转开解,恢复成图1所示那样。跟着会执行M1后续的代码。图4:? 托管堆上对象的分配 ???????? 讨论完了堆栈上的内存分配之后,我们再来看下托管堆上对象的分配。我们知道在.Net中值类型是存储在堆栈上,引用类型是存储在托管堆上,上面线程堆栈的分配中,name是string类型,属于引用类型,string的分配属于比较特殊的部分,这里我推荐: HYPERLINK /artech Artech的大作: HYPERLINK /artech/archive/2007/03/04/663728.aspx 字符串的驻留(String Interning) HYPERLINK /anytao Anytao的大作: HYPERLINK /anytao/archive/2007/05/28/must_net_09.html [你必须知道的.Net]第九回:品味类型—值类型与引用类型(中)—规则无边 说明:在涛哥的这篇文章中,建议多看看精彩的评论。 ???????? 现在,假定有以下两个类定义如下: // Employee 类定义 internal class Employee{ public int GetYearEmployed(){…} public virtual String GetProgressReport(){…} public static Employee Lookup(String name)(){…} } // Manager类定义 继承自 Employee internal sealed class Manager:Employee{ public override String GetProgressReport(){…} } HYPERLINK javascript:void(0); 复制代码 ?? ? ? ? 现在Windows进程已经启动,CLR已经加载完成,托管对已初始化,而且已经创建好了一个线程连同他的1MB的堆栈控件。该线程已经执行了一些代码,现在马上就要调用M3代码。图5展示了当前的状况。M3方法包含的代码演示了CLR是如何工作的。我们

文档评论(0)

qiwqpu54 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档