类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法(第二次修改)
1、线程栈
window的一个进程加载clr。该进程可能含有多个线程,线程创建的时候会分配1MB的栈空间。
如图:
void Method()
{
string name="zhangsan"; //name 被放入栈里面
Method2(name); //1参数变量s 被压入栈,s引用name的地址 2.返回地址被压入栈,方法执行完(method2的 return)指针指向此返回地址
return;
}
void Method2(string s)
{
int32 length=s.Length;
int32 tally;
return; //methed2执行完后,指针指向线程栈的返回地址,method2的栈帧展开
}

2.运行时关系
现有如下2个类型
internal class Employee
{
public int32 M1(){.....};
public virtual string M2(){.....};
public static Employee M3(string name){.....};
}
internal sealed class Manager:Employee
{
public override string M2(){.....};
}
准备:window进程已经开启,clr已经加载到进程里面,托管堆已经初始化,线程栈也已经被创建(连同它的1MB的栈空间)
void M4()
{
Employee e;
int32 age;
e=new Manager();
e=Employee.M3("zhangsan");
age=e.M1();
e.M2();
}
a.首先介绍下new 关键字的执行的时候会执行什么
1.clr计算出类型的所有实例字段的字节和所有基类型的实例字段的字节长度,创建类型对象指针和同步块索引(也计算在字节长度内)
2.在托管堆上分配第一步长度的空间
3.初始化类型对象指针(指向类型对象)和同步块索引
4.调用类型的实例构造器。
b.运行关系图

c.详细解释
1.M4运行的时候 先在线程栈 压入e和age两个局部变量
2.e=new Manager();会在托管推上分配Manager和所有基类的实例字段字节大小,初始化类型对象指针,指向Manager类型对象。
3 调用静态方法,Employee.M3("zhangsan");直接找到M3j静态方法的定义类型Employee,然后去类型对象的方法列表中找到这个方法( 第一个对象将被垃圾回收器回收),
然后JIT进行编译,然后执行。
4.调用非虚方法,e.M1(); 找到变量e的声名类型(Employee),在方法列表中找到对应的方法,编译执行(如果没有就向上回溯直到System.Object,能够会所查找方法是因为在派生类中有指向基类的引用)
5.调用虚方法,e.M2()找到e对象,利用其指针找到e 的实例对象类型(Manager对象),在利用实例对象的类型对象指针找到对象的实际的类型对象(Manager),调用Manager类型对象方法列表中的M2 而不是Employee中的。
类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法(第二次修改)的更多相关文章
- .NET中 类型,对象,线程栈,托管堆在运行时的关系
.NET中 类型,对象,线程栈,托管堆在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and T ...
- [读书心得] .NET中 类型,对象,线程栈,托管堆在运行时的关系
.NET中 类型,对象,线程栈,托管堆 在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and ...
- C# 类型、对象、线程栈和托管堆在运行时的关系
我们将讨论类型.对象.线程栈和托管堆在运行时的相互关系,假定有以下两个类定义: internal class Employee { public int GetYearsEmplo ...
- C# (类型、对象、线程栈和托管堆)在运行时的相互关系
在介绍运行时的关系之前,先从一些计算机基础只是入手,如下图: 该图展示了已加载CLR的一个windows进程,该进程可能有多个线程,线程创建时会分配到1MB的栈空间.栈空间用于向方法传递实参,方法定义 ...
- [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自Sy ...
- C# 运行时的关系
简介 记录c#对象在托管堆中运行时的相互关系,如下记录了一个方法在执行时候的生命周期,当方法在之前,CLR会先执行将方法里面所有用到的局部变量.参数对应的内存地址等全部存放当前线程栈当中,并且会将所有 ...
- (59)Wangdao.com第十天_JavaScript 对象在 栈和堆
对象的属性值 如果要使用特殊的属性名,需 对象["属性名"] = 属性值 // 存 对象["属性名"] // 取 obj["1 ...
- C# 获取变量或对象的栈与堆地址
C# 获取变量或对象的栈与堆地址 来源 https://www.cnblogs.com/xiaoyaodijun/p/6605070.html using System; using System.C ...
- 关于Class对象、类加载机制、虚拟机运行时的内存布局的全面解析和推测
简介: 本文是对Java的类加载机制,Class对象,反射原理等相关概念的理解.验证和Java虚拟机中内存布局的一些推测.本文重点讲述了如何理解Class对象以及Class对象的作用. 欢迎探讨,如有 ...
随机推荐
- 基于MFC的socket编程
网络编程 1.windows 套接字编程(开放的网络编程接口)添加头文件#include<windows.h> 2.套接字及其分类 socket分为两种:(1)数据报socket:无连接套 ...
- 背水一战 Windows 10 (113) - 锁屏: 将 Application 的 Badge 通知和 Tile 通知发送到锁屏, 将 secondary tile 的 Badge 通知和 Tile 通知发送到锁屏
[源码下载] 背水一战 Windows 10 (113) - 锁屏: 将 Application 的 Badge 通知和 Tile 通知发送到锁屏, 将 secondary tile 的 Badge ...
- 「ZJOI2018」历史(LCT)
「ZJOI2018」历史(LCT) \(ZJOI\) 也就数据结构可做了-- 题意:给定每个点 \(access\) 次数,使轻重链切换次数最大,带修改. \(30pts:\) 挺好想的.发现切换次数 ...
- Android优化指南
Android系统中GC内存泄漏的原因 主动回收内存System.gc();.getruntime.runtime.gc 导致内存泄漏主要的原因是,申请了内存空间而忘记了释放.如果程序中存在对无用对象 ...
- Android语音识别
语音识别 - 科大讯飞 开放平台 http://open.voicecloud.cn/ 需要拷贝lib.assets.并在清单文件中写一些权限 public class MainActivity ex ...
- vi命令详解(转)
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...
- Go语言生成随机数
在Go语言中生成随机数需要使用Seed(value)函数来提供伪随机数生成种子,一般情况下都会使用当前时间的纳秒数字,如果不在生成随机数之前调用该函数,那么每次生成的随机数都是一样的. 函数rand. ...
- CSS3——:nth-child选择器基本用法简述
注:n 是从1开始的 :nth-child 是 CSS3 提供的一个好用的选择器,因为在项目中经常用到,所以简单总结了它的常用方法 下面示例代码截图用的是同一个例子,p元素的父元素都是body p ...
- Metasploit Framework(5)弱点扫描
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 当我们发现了目标机器开放的端口,开启的服务等等之后 就 ...
- Kali学习笔记4:DNS信息收集
DNS记录 A记录 A记录是用来创建到IP地址的记录. A记录设置技巧 1.如果想创建不带www的记录,即cnblog.com,在主机记录中填写@或者留空,不同的注册商可能不一样. 2.创建多个域名到 ...