博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  CLR

摘要:其实多态调用,总结起来很简单,1 父类的虚方法在子类中会有拷贝,且slot一一对应2 编译的时候,如果是变量所在类型里,该函数是虚函数,那么虚函数会形成这样的模式【实际的对象类型】+【slot偏移量】 ,其中slot偏移量对于同一个虚函数来说,他是固定的 这样在执行的时候,根据实际的类型,就形成多态调用了 如果是变量所在类型里该函数不是虚函数,在编译后一个指针,直接指向了要调用函数的地址 阅读全文

posted @ 2013-05-04 17:13 qianyz 阅读(166) 评论(0) 推荐(0) 编辑

摘要:在上一篇文章CLR怎样实现虚方法的多态调用(1)中主要介绍了CLR怎样多态调用虚方法以及各种类型的方法在Method Table中的排布,但是没有介绍怎样调用接口方法,当某个对象向上转型为接口时进行多态调用时,CLR是怎样实现的呢?以下面这段代码为例来说明:namespace Demo{ public interface IFoo { void Foo(); } public class Base : IFoo { public void Foo() { Console.WriteLine("In b... 阅读全文

posted @ 2012-11-17 13:04 qianyz 阅读(186) 评论(0) 推荐(0) 编辑

摘要:最近一直对.net framework中,虚方法的调用是如何实现这个问题有些疑惑,在看了Essential .Net关于Method的那一章和Artech推荐的文章Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects以后,还是一知半解,有些疑惑得不到答案。主要有这些: 父类定义的非虚方法是否在子类中有拷贝? 虚方法是如何实现多态的? 子类继承父类的虚方法实现是否和继承非虚方法机制相同? 如果子类隐藏了父类的虚方法,这又是怎样实现的? 当然问题不止这么多,关于接口方面还有很多很多疑惑,不过时间 阅读全文

posted @ 2012-11-17 13:03 qianyz 阅读(269) 评论(0) 推荐(0) 编辑

摘要:http://www.cnblogs.com/lbq1221119http://www.cnblogs.com/lbq1221119/category/117125.htmlhttp://www.cnblogs.com/knightswarrior/articles/1742172.html 阅读全文

posted @ 2012-11-17 09:56 qianyz 阅读(113) 评论(0) 推荐(0) 编辑

摘要:微软声称.NET是一种革命性的编程技术。许多要素使它成为大多数开发人员的首选。本文我们将要讨论一下.NET Framework中一个很主要的优势——内存和资源管理的便捷性。关于垃圾回收器 每个程序都会使用一定次序的资源,或内存缓冲区,或网络连接,或数据库资源等等。实际上,在面向对象环境中,每种类型都被看作是程序的某些有效资源。为了使用这些资源,必须分配部分内存来描述这种类型。 资源访问按一下步骤进行:1. 为类型分配内存来描述资源。2. 初始化资源,把资源设置成初始化状态,使资源可用。3. 通过访问类型实例的成员来使用资源(按需求重复)。4. 销毁资源状态以清除资源。5. 释放内存。.NET中 阅读全文

posted @ 2012-03-13 10:01 qianyz 阅读(278) 评论(0) 推荐(0) 编辑

摘要:上一篇文章介绍了.Net 垃圾回收的基本原理和垃圾回收执行Finalize方法的内部机制;这一篇我们看下弱引用对象,代,多线程垃圾回收,大对象处理以及和垃圾回收相关的性能计数器。让我们从弱引用对象说起,弱引用对象可以减轻大对象带来的内存压力。弱引用(Weak References)当程序的根对象指向一个对象时,这个对象是可达的,垃圾回收器不能回收它,这称为对对象的强引用。和强引用相对的是弱引用,当一个对象上存在弱引用时,垃圾回收器可以回收此对象,但是也允许程序访问这个对象。这是怎么回事儿呢?请往下看。如果一个对象上仅存在弱引用,并且垃圾回收器在运行,这个对象就会被回收,之后如果程序中要访问这个 阅读全文

posted @ 2012-03-13 09:54 qianyz 阅读(293) 评论(0) 推荐(0) 编辑

摘要:【译】.Net 垃圾回收机制原理(一)转载:yukaizhao有了Microsoft.Net clr中的垃圾回收机制程序员不需要再关注什么时候释放内存,释放内存这件事儿完全由GC做了,对程序员来说是透明的。尽管如此,作为一个.Net程序员很有必要理解垃圾回收是如何工作的。这篇文章我们就来看下.Net是如何分配和管理托管内存的,之后再一步一步描述垃圾回收器工作的算法机制。为程序设计一个适当的内存管理策略是困难的也是乏味的,这个工作还会影响你专注于解决程序本身要解决的问题。有没有一种内置的方法可以帮助开发人员解决内存管理的问题呢?当然有了,在.Net中就是GC,垃圾回收。让我们想一下,每一个程序都 阅读全文

posted @ 2012-03-13 09:52 qianyz 阅读(199) 评论(0) 推荐(0) 编辑

摘要:We were unable to locate this content in zh-cn.Here is the same content in en-us.JIT and RunDrill Into .NET Framework Internals to See How the CLR Creates Runtime ObjectsHanu KommalapatiandTom ChristianThis article discusses:SystemDomain, SharedDomain, and DefaultDomainObject layout and other memory 阅读全文

posted @ 2011-11-14 11:34 qianyz 阅读(369) 评论(0) 推荐(0) 编辑

摘要:•SystemDomain, SharedDomain, and DefaultDomain•对象布局和内存细节。•方法表布局。•方法分派(Method dispatching)。本文使用下列技术:.NET Framework, C#本页内容CLR启动程序(Bootstrap)创建的域系统域(System Domain)共享域(Shared Domain)默认域(Default Domain)加载器堆(Loader Heaps)类型原理对象实例方法表基实例大小方法槽表(Method Slot Table)方法描述(MethodDesc)接口虚表图和接口图虚分派(Virtual Dispatch 阅读全文

posted @ 2011-11-14 11:32 qianyz 阅读(517) 评论(0) 推荐(0) 编辑

摘要:有很多朋友都分析过System.Object作为Dotnet Framework里面的一个基类,她的特性、方法特点及其相关的概念,这篇博文里面,我就从System.Object这个基类的定义以及底层实现的角度,探索这个基类对象在内存里面的布局模型,探索这个基类最本质的面目。首先,从一个Type的实例在内存里面的布局模型、以及一个实例的各个部分在一个托管进程结构里面对应安排到相应的哪个部分说起。下面是一个简单的实例结构示意图以及逻辑结构图:通常所说的对一个Object的引用,实际上这个Object的Ref是指向GC Heap或者是Thread的Heap里面的这个实例的Object Header这 阅读全文

posted @ 2011-11-06 21:51 qianyz 阅读(343) 评论(0) 推荐(0) 编辑

摘要:一 多态的例子 class Program { static void Main(string[] args) { Cpu c1 = new Cpu(); c1.fun(); Cpu c2 = new IntelCpu(); c2.fun(); Cpu c3_1 = new NewCpu(); c3 阅读全文

posted @ 2011-11-04 02:39 qianyz 阅读(362) 评论(0) 推荐(0) 编辑

摘要:一 调用方法的IL指令 我们知道在.NET中一共有三种方法:实例方法,静态方法和虚方法。当程序被编译成IL代码时,我们可以看到有两个调用方法的IL指令,分别是call和callvirt。我们首先看下下面的列子: class Cpu { public Cpu() { Console.WriteLine 阅读全文

posted @ 2011-11-04 02:38 qianyz 阅读(461) 评论(0) 推荐(0) 编辑

摘要:封装、继承、多态是面向对象的最重要的3个特点。但是想真的弄明白他们其中的奥秘还是的费一番功夫。记得在学校学习C++的时候,讲到这个地方,自己早已是一头雾水,当时还在想,弄成private做什么,多麻烦啊。到了多态,继承更是昏死了。今天就来深入了解下其中的奥秘吧。本文主要是从内存结构出发来讲解.NET中的继承和多态,因为内存布局的不同所以和其他语言中的继承多态可能有一定区别。一 笔试题目class Program { static void Main(string[] args) { Cpu c1 = new Cpu(); c1.fun(); Cpu c2 = new IntelCpu(); c 阅读全文

posted @ 2011-11-04 02:37 qianyz 阅读(284) 评论(0) 推荐(0) 编辑

摘要:Object内存核心结构及实现完全剖析(MethodTable、EEClass与MethodDescChunk)无疑,一个Object在CLR中的逻辑结构是相当复杂的。前段时间,写了一篇CLR探索系列:System.Object内存布局模型及实现研究,侧重从System.Object这个基本类的基本内存布局,实现和结构来研究了下。这是远远不够的。今天就从如何存储一个Object中的Field,Method等信息,这些信息的逻辑组织方式和存储的逻辑结构。废话不多说,看看就知道了:首先,给一个图: 这个图,显示了一个Object的MethodTable,EEClass和MethodDescChun 阅读全文

posted @ 2011-11-03 16:36 qianyz 阅读(284) 评论(0) 推荐(0) 编辑

摘要:【读书笔记】.NET本质论第四章-Programming with Type(Part Two)2009-08-31 09:17 by 横刀天笑, 2334 visits,收藏,编辑欢迎阅读本系列其他文章:【读书笔记】.NET本质论第一章 The CLR as a Better COM【读书笔记】.NET本质论第二章-Components(Part One)【读书笔记】.NET本质论第二章-Components(Part Two,public key)【读书笔记】.NET本质论第二章-Components(Part Three,CLR Loader)【读书笔记】.NET本质论第二章-Compo 阅读全文

posted @ 2011-11-03 16:33 qianyz 阅读(207) 评论(0) 推荐(0) 编辑

摘要:揭示同步块索引(中):如何获得对象的HashCode题外话:为了尝鲜,也兴冲冲的安装了Win7,不过兴奋之余却郁闷不已,由于是用Live Writer写博客,写了好几篇草稿,都完成了80%左右,没有备份全部没了。欲哭无泪,只好重写了。Visual Studio + SOS 小实验咋一看标题,觉得有些奇怪,同步块索引和HashCode有啥关系呢。从名字上来看离着十万八千里。在不知道细节之前,我也是这样想的,知道细节之后,才发现这两兄弟如此亲密。我们还是先来用Visual Studio + SOS,看一个东西,下面是作为小白兔的示例代码: 1: using System; 2: publi... 阅读全文

posted @ 2011-10-26 11:10 qianyz 阅读(256) 评论(0) 推荐(0) 编辑

摘要:揭示同步块索引(上):从lock开始大家都知道引用类型对象除实例字段的开销外,还有两个字段的开销:类型指针和同步块索引(SyncBlockIndex)。同步块索引这个东西比起它的兄弟类型指针更少受人关注,显得有点冷落,其实此兄功力非凡,在CLR里可谓叱咤风云,很多功能都要借助它来实现。 接下来我会用三篇来介绍同步块索引在.NET中的所作所为。 既然本章副标题是从lock开始,那我就举几个lock的示例:代码1 1: public class Singleton 2: { 3: private static object lockHelper = new object(); ... 阅读全文

posted @ 2011-10-26 11:09 qianyz 阅读(471) 评论(2) 推荐(1) 编辑

摘要:揭示同步块索引(下):总结同步块的三个作用1 GC启动时候用来进行垃圾回收算法的时候会用到同步块的一个位,作为标志2 hashcode3 lock前面,我用两篇文章详细的讨论了同步块索引在lock和GetHashCode所起的作用。不过两篇文章是分开来讨论的。那可能有人会问,如果我有一个object,它既作为lock的lockHelper对象,也要调用它的GetHashCode方法该怎么办,难道这个同步块索引还可以承担这两个任务么。同步块索引是可以承担这两个任务,但是里面却隐藏着更大的秘密,我们先来看看与同步块索引相关的结构: 大致就是这样的一个结构,一个对象的ObjectHeader中的Sy 阅读全文

posted @ 2011-10-26 11:08 qianyz 阅读(202) 评论(0) 推荐(0) 编辑

摘要:1、简介能够动态执行 C# 代码是一件很酷的功能,比如,我们可以在控制台中输入一行 C# 代码,然后程序自动编译并执行这一行代码,将结果显示给我们。这差不多就是一个最简单的 C# 代码解释器了。动态执行 C# 代码又是一件很有用的功能,比如,我们可以将某些代码写在某个文件之中,由程序集在执行时进行加载,改变这些代码不用中止程序,当程序再次加载这些代码时,就自动执行的是新代码了。下面,我将在写一个简... 阅读全文

posted @ 2010-10-07 11:09 qianyz 阅读(370) 评论(0) 推荐(0) 编辑

摘要:CLR探索系列:System.Object内存布局模型及实现研究 只有深究最本质的东西,才能把握最本质的东西。有很多朋友都分析过System.Object作为Dotnet Framework里面的一个基类,她的特性、方法特点及其相关的概念,这篇博文里面,我就从System.Object这个基类的定义以及底层实现的角度,探索这个基类对象在内存里面的布局模型,探索这个基类最本质的面目。首先,从一个Ty... 阅读全文

posted @ 2010-10-07 10:48 qianyz 阅读(339) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示