﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-ILove's Dev Home - &lt;span style="font-size:12px; padding:6px 10px;"&gt;休息的时候不要忘记 别人还在奔跑&lt;/span&gt;-最新评论</title><link>http://www.cnblogs.com/ILove/CommentsRSS.aspx</link><description /><language>zh-cn</language><pubDate>Mon, 10 Nov 2008 04:03:51 GMT</pubDate><lastBuildDate>Mon, 10 Nov 2008 04:03:51 GMT</lastBuildDate><generator>cnblogs</generator><item><title>re: 理解 Thread.Sleep 函数</title><link>http://www.cnblogs.com/ILove/archive/2008/09/04/1140419.html#1308389</link><dc:creator>畅想者</dc:creator><author>畅想者</author><pubDate>Thu, 04 Sep 2008 07:33:41 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/09/04/1140419.html#1308389</guid><description><![CDATA[HOHO，文笔很好啊，一下就记住了文章的知识点。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">畅想者</a> 2008-09-04 15:33 <a href="http://www.cnblogs.com/ILove/archive/2008/09/04/1140419.html#1308389#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你为什么会慢</title><link>http://www.cnblogs.com/ILove/archive/2008/06/11/1157229.html#1223080</link><dc:creator>dddddddddd</dc:creator><author>dddddddddd</author><pubDate>Wed, 11 Jun 2008 07:35:52 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/06/11/1157229.html#1223080</guid><description><![CDATA[--引用--------------------------------------------------<br>随风逝去（叶进）: @Vincent Yang<br>哈哈   很有可能噢<br>--------------------------------------------------------<br>hh<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">dddddddddd</a> 2008-06-11 15:35 <a href="http://www.cnblogs.com/ILove/archive/2008/06/11/1157229.html#1223080#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 理解 Thread.Sleep 函数</title><link>http://www.cnblogs.com/ILove/archive/2008/05/26/1140419.html#1208943</link><dc:creator>zsea</dc:creator><author>zsea</author><pubDate>Mon, 26 May 2008 00:55:58 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/05/26/1140419.html#1208943</guid><description><![CDATA[写得很好，你是老师哇？<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">zsea</a> 2008-05-26 08:55 <a href="http://www.cnblogs.com/ILove/archive/2008/05/26/1140419.html#1208943#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 在.Net中使用异步（一）</title><link>http://www.cnblogs.com/ILove/archive/2008/05/04/1139316.html#1181991</link><dc:creator>23</dc:creator><author>23</author><pubDate>Sun, 04 May 2008 08:41:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/05/04/1139316.html#1181991</guid><description><![CDATA[牛B <br>由浅入深 像做爱一样<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">23</a> 2008-05-04 16:41 <a href="http://www.cnblogs.com/ILove/archive/2008/05/04/1139316.html#1181991#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1170053</link><dc:creator>中华小鹰</dc:creator><author>中华小鹰</author><pubDate>Thu, 24 Apr 2008 14:47:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1170053</guid><description><![CDATA[请教,生成的汇编代码是正宗的80X86汇编吗?<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">中华小鹰</a> 2008-04-24 22:47 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1170053#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1169045</link><dc:creator>信110</dc:creator><author>信110</author><pubDate>Thu, 24 Apr 2008 04:03:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1169045</guid><description><![CDATA[呵呵，这个例子是从CLR VIA C#看的，没想太明白，就引用了 嘎嘎<br>我理解：<br>执行base.ToString()时传递的隐含参数是指向A实例的，如果用callvirt<br>经00000039 mov ecx,edi<br>0000003b mov eax,dword ptr [ecx]<br>0000003d call dword ptr [eax+38h] 一圈  不又绕回来了么，<br>用call，把Object的虚方法ToString当非虚方法调用，直达目的，不能绕圈。<br>在这个例子里把base.ToString()看成Object.ToString()行吧。<br>看成Object.ToString(a)。<br><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">信110</a> 2008-04-24 12:03 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1169045#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168989</link><dc:creator>没有昵称</dc:creator><author>没有昵称</author><pubDate>Thu, 24 Apr 2008 03:34:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168989</guid><description><![CDATA[@信110<br>经提醒突然有了思路。<br>两个ToString的偏移是相同的，不过方法的隐含参数“this”不同。很可能是执行base.ToString()时传递的隐含参数决定了执行这一句时使用的虚函数指针表是基类型的，而不是当前类型。这样就可以避免死循环。<br><br>中午抽空再仔细看看反汇编代码，现在先认真工作呵呵。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">没有昵称</a> 2008-04-24 11:34 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168989#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168967</link><dc:creator>信110</dc:creator><author>信110</author><pubDate>Thu, 24 Apr 2008 03:25:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168967</guid><description><![CDATA[class A{public  virtual string ToString(){return &quot;HellO&quot;;}}<br>当：A a = new A() a.ToString() :<br>IL:      callvirt   instance string A::ToString()<br>当：Object a = new A() a.ToString();<br>IL:      callvirt   instance string [mscorlib]System.Object::ToString()<br>虚方法调用的实际类型(this)是在运行时决定的，但虚方法的偏移量在编译时便指定，这个’指定‘是指按照哪个类型计算偏移量，A::ToString()是按A计算偏移，<br>Object::ToString()按Object计算便宜（两个ToString偏移是不同的），因为有虚方法偏移值在继承层次中的固定性，便在运行时由动态的this加上‘固定的‘的偏移实现了多态。<br>既然A::ToString()的偏移指定的是自己的ToString()，而不是Object的ToString()，概念上便有了’隐藏‘（建议用new关键字指出）<br>（似乎是废话，瞎理解的，嘎嘎）<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">信110</a> 2008-04-24 11:25 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168967#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168947</link><dc:creator>没有昵称</dc:creator><author>没有昵称</author><pubDate>Thu, 24 Apr 2008 03:14:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168947</guid><description><![CDATA[@Da Vinci<br>@信110<br>呵呵，，谢谢两位补充。<br>本来是想说这里的callvirt并不一定是调用的虚方法，结果描述的不严谨，导致很多错误哈。加上两位的说法就好了。^_^<br><br>用call的都是能够明确调用的是哪个方法的；不过对于15楼提到的“为避免循环调用”而使用call，偶还没弄明白呵：<br>如果ClassA继承object，重写了ToString，ClassB继承ClassA，重写ToString时使用了return base.ToString()，那么下面这句话：<br>object obj = new ClassB();<br>obj.ToString();<br>究竟是怎样避免循环调用的呢？编译器咋知道应该调用的是ClassA.ToString，而不是Object.ToString或者ClassB.ToString？如果说在ClassB的虚函数表中没有更改这个方法的入口，明显是不合理的。因为如果ClassB.ToString在return之前执行了其他操作，那这样处理明显会使得这些操作无效。那么究竟是怎样避免循环调用的呢？思考中。。。<br><br>顺便请教两位。^_^<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">没有昵称</a> 2008-04-24 11:14 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168947#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168934</link><dc:creator>Da Vinci</dc:creator><author>Da Vinci</author><pubDate>Thu, 24 Apr 2008 03:07:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168934</guid><description><![CDATA[@没有昵称<br>引用类型的函数调用产生的都是callvirt指令? call好像也可以调虚方法吧 避免执类型装箱的时候用的是call, 对于密封类型的引用的虚方法也是用call的, 因为没必要检查实际类型<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">Da Vinci</a> 2008-04-24 11:07 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168934#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168895</link><dc:creator>信110</dc:creator><author>信110</author><pubDate>Thu, 24 Apr 2008 02:48:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168895</guid><description><![CDATA[class A{ public override string ToString(){return base.ToString();}}<br>为避免循环调用， base.ToString() 生成的是：<br>call       instance string [mscorlib]System.Object::ToString()<br><br>int i =3;<br>Console.Write(i.ToString());<br>值类型虚调用不存在多态 所以：<br>i.ToString() 生成的是：<br>call       instance string [mscorlib]System.Int32::ToString()<br><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">信110</a> 2008-04-24 10:48 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168895#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168818</link><dc:creator>没有昵称</dc:creator><author>没有昵称</author><pubDate>Thu, 24 Apr 2008 02:23:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168818</guid><description><![CDATA[需要指出的是，上面的IL代码中，全部都是 callvirt 指令而不是 call 指令，之际上如果这里不是虚方法，产生的也是 callvirt 指令，因为他们的区别是如果对象为null，call指令不会产生空引用异常，而callvirt会产生空引用异常。<br><br>所以对于引用类型的函数调用，产生的总是callvirt指令，因为需要在调用方法时判断对象是否为空。call指令只会在调用值类型的方法时才会产生，因为值类型的实例永远不会为null。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">没有昵称</a> 2008-04-24 10:23 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168818#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168789</link><dc:creator>没有昵称</dc:creator><author>没有昵称</author><pubDate>Thu, 24 Apr 2008 02:13:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168789</guid><description><![CDATA[从IL代码中根本看不出什么。<br><br>我改了下源代码：<br><br><br>        public void Fun()<br>        {<br>            ClassA a = null;<br>            ClassB b = null;<br><br>            a = new ClassA(1);<br>            b = new ClassB(1);<br><br>            a.ToString();<br>            b.ToString();<br><br>            a = b;<br>            a.ToString();<br>        }<br><br>    public class ClassB : ClassA<br>    {<br>        private int _value;<br><br>        public ClassB(int value) : base(value)<br>        {<br>            this._value = value;<br>        }<br><br>        public override string ToString()<br>        {<br>            return this._value.ToString();<br>        }<br><br><br>便以后的 IL 代码是这样的：<br><br>.method public hidebysig instance void  Fun() cil managed<br>{<br>  // 代码大小       42 (0x2a)<br>  .maxstack  2<br>  .locals ([0] class ConsoleApp.ClassA a,<br>           [1] class ConsoleApp.ClassB b)<br>  IL_0000:  ldnull<br>  IL_0001:  stloc.0<br>  IL_0002:  ldnull<br>  IL_0003:  stloc.1<br>  IL_0004:  ldc.i4.1<br>  IL_0005:  newobj     instance void ConsoleApp.ClassA::.ctor(int32)<br>  IL_000a:  stloc.0<br>  IL_000b:  ldc.i4.1<br>  IL_000c:  newobj     instance void ConsoleApp.ClassB::.ctor(int32)<br>  IL_0011:  stloc.1<br>  IL_0012:  ldloc.0<br>  IL_0013:  callvirt   instance string ConsoleApp.ClassA::ToString()<br>  IL_0018:  pop<br>  IL_0019:  ldloc.1<br>  IL_001a:  callvirt   instance string ConsoleApp.ClassB::ToString()<br>  IL_001f:  pop<br>  IL_0020:  ldloc.1<br>  IL_0021:  stloc.0<br>  IL_0022:  ldloc.0<br>  IL_0023:  callvirt   instance string ConsoleApp.ClassA::ToString()<br>  IL_0028:  pop<br>  IL_0029:  ret<br>} // end of method Class2::Fun<br><br>可以看到IL并没有对虚函数做处理，而是在JIT编译的时候才去处理的。实际上虚函数指针表要保存函数的便宜量，而只有在JIT编译了之后才会知道函数生成的代码段有多大，才会知道函数相对于基址的便宜量。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">没有昵称</a> 2008-04-24 10:13 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168789#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168751</link><dc:creator>没有昵称</dc:creator><author>没有昵称</author><pubDate>Thu, 24 Apr 2008 01:58:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168751</guid><description><![CDATA[@信110<br>嗯，在生成子类的虚函数指针表时，如果子类没有override父类的虚方法，会把基类对应虚方法的地址拷贝一份放在自己的虚函数指针表中来，而且顺序是跟基类完全一样的。如果子类有新定义的虚函数，会添加在表的后面。<br><br>这样就保证了子类的虚函数指针表中的前半部分跟父类的是结构相似的：个数一样、函数顺序一样。这样在整个类层次结构中，就可以保证同一个虚方法在虚函数指针表中的便宜量是相同的。从而实现多态。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">没有昵称</a> 2008-04-24 09:58 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168751#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168744</link><dc:creator>Da Vinci</dc:creator><author>Da Vinci</author><pubDate>Thu, 24 Apr 2008 01:55:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168744</guid><description><![CDATA[@李战<br>反汇编就用编译器就可以 windbg什么的都行<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">Da Vinci</a> 2008-04-24 09:55 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168744#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168732</link><dc:creator>Da Vinci</dc:creator><author>Da Vinci</author><pubDate>Thu, 24 Apr 2008 01:50:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168732</guid><description><![CDATA[和C++虚函数表机制有些类似 不过似乎不同编译器产生的vtbl构造不同 <br>LZ也应该把IL贴出来 与汇编结果比较分析就好了<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">Da Vinci</a> 2008-04-24 09:50 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168732#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168702</link><dc:creator>生鱼片</dc:creator><author>生鱼片</author><pubDate>Thu, 24 Apr 2008 01:42:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168702</guid><description><![CDATA[学习<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">生鱼片</a> 2008-04-24 09:42 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168702#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168637</link><dc:creator>没有昵称</dc:creator><author>没有昵称</author><pubDate>Thu, 24 Apr 2008 01:16:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168637</guid><description><![CDATA[@李战<br>调试模式下，“调试——窗口——反汇编”，或者ctrl + alt + d<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">没有昵称</a> 2008-04-24 09:16 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168637#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168604</link><dc:creator>紫色阴影</dc:creator><author>紫色阴影</author><pubDate>Thu, 24 Apr 2008 01:00:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168604</guid><description><![CDATA[我也写过一篇 :) <br><a href="http://www.cnblogs.com/blusehuang/archive/2007/07/27/net_framework_virtual_function_1.html" target="_new">http://www.cnblogs.com/blusehuang/archive/2007/07/27/net_framework_virtual_function_1.html</a><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">紫色阴影</a> 2008-04-24 09:00 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168604#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168600</link><dc:creator>镜涛</dc:creator><author>镜涛</author><pubDate>Thu, 24 Apr 2008 00:58:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168600</guid><description><![CDATA[不错，对于.NET编译有了新的认识。赫赫。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">镜涛</a> 2008-04-24 08:58 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168600#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168598</link><dc:creator>信110</dc:creator><author>信110</author><pubDate>Thu, 24 Apr 2008 00:58:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168598</guid><description><![CDATA[帖下俺写的东西，希望没写错呵呵。<br>using System;<br>class A<br>{<br>    public virtual void Say()<br>    {<br>        Console.WriteLine(&quot;In A&quot;);<br>    }  <br>}<br>class B:A<br>{<br>    public override void Say()<br>    {<br>        Console.WriteLine(&quot;In B&quot;);<br>    }<br>}<br>class C:A<br>{<br>    public override  void Say()<br>    {<br>        Console.WriteLine(&quot;In C&quot;);<br>    }<br>}<br>class Test<br>{<br>    static void Main()<br>    {<br>        A a = new B();<br>        a.Say();        <br>    }<br>}<br>a.Say();<br>00000039  mov         ecx,edi   <br>0000003b  mov         eax,dword ptr [ecx]  <br>0000003d  call        dword ptr [eax+38h] <br>用Vs2005+sos看看：<br>先找到this：(寄存器窗口也能看见）<br>!clrstack -a<br>PDB symbol for mscorwks.dll not loaded<br>OS Thread Id: 0xb0 (176)<br>ESP       EIP     <br>0013f444 00f400b1 Test.Main()<br>    LOCALS:<br>        &lt;CLR reg&gt; = 这个:0x013e1b64<br><br>0013f69c 79e88f63 [GCFrame: 0013f69c]<br><br><br>由this找到typehandle：<br>!do 013e1b64<br>Name: B<br>这个：MethodTable: 00a63118<br>EEClass: 00a61458<br>Size: 12(0xc) bytes<br> (E:\vs2005Pro\EditILTest\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe)<br>Fields:<br>None<br>call  dword ptr [eax+38h] 等于 call dword ptr [00a63118+38h] <br>等于call        dword ptr [00a63150]<br>通过内存窗口可看到00a63150存放着00a63160<br>call  dword ptr [00a63150] 就是 call 00a63160 （汇编很不熟 希望没说错）<br>00a63160又是什么：<br>!dumpmt -md 00a63118<br>EEClass: 00a61458<br>Module: 00a62c14<br>Name: B<br>mdToken: 02000003  (E:\vs2005Pro\EditILTest\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe)<br>BaseSize: 0xc<br>ComponentSize: 0x0<br>Number of IFaces in IFaceMap: 0<br>Slots in VTable: 6<br>--------------------------------------<br>MethodDesc Table<br>   Entry MethodDesc      JIT Name<br>79354bec   7913bd48   PreJIT System.Object.ToString()<br>793539c0   7913bd50   PreJIT System.Object.Equals(System.Object)<br>793539b0   7913bd68   PreJIT System.Object.GetHashCode()<br>7934a4c0   7913bd70   PreJIT System.Object.Finalize()<br>这个：00a63160   00a63108      JIT B.Say()<br>00a63170   00a63110      JIT B..ctor()<br><br>call 00a63160看见没，是B.Say()的入口。<br>问题的关键在这三行：<br>00000039  mov         ecx,edi <br>0000003b  mov         eax,dword ptr [ecx] <br>0000003d  call        dword ptr [eax+38h] <br>【eax+38h】 这个38h就是虚方法在方法表中的位移，clr通过保证同一虚方法在继承层次结构中的方法位移是不变的，来实现了多态。<br>就像您文中：<br>a.ToString()---&gt;00000056  call        dword ptr [eax+28h]<br>b.ToString()---&gt;00000056  call        dword ptr [eax+28h]<br>这两个28h很醒目哈<br>以上是自己的理解，不对还望指教-_-<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">信110</a> 2008-04-24 08:58 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168598#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168585</link><dc:creator>good man</dc:creator><author>good man</author><pubDate>Thu, 24 Apr 2008 00:50:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168585</guid><description><![CDATA[高深啊,看到有一点晕<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">good man</a> 2008-04-24 08:50 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168585#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168554</link><dc:creator>李战</dc:creator><author>李战</author><pubDate>Thu, 24 Apr 2008 00:28:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168554</guid><description><![CDATA[<img src="http://www.cnblogs.com/Emoticons/msn/regular_smile.gif"  alt="" />请教楼主，怎样能得到C#程序的本机指令的反汇编？不是中间语言IL的，而是你那种X86指令形式的。<img src="http://www.cnblogs.com/Emoticons/msn/tongue_smile.gif"  alt="" />
<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">李战</a> 2008-04-24 08:28 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168554#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168467</link><dc:creator>没有昵称</dc:creator><author>没有昵称</author><pubDate>Wed, 23 Apr 2008 17:31:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168467</guid><description><![CDATA[@墙头草<br>看来没说明白。^_^<br>我也觉得说得不够浅显易懂。慢慢锻炼吧呵。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">没有昵称</a> 2008-04-24 01:31 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168467#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 虚函数的调用机制</title><link>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168458</link><dc:creator>墙头草</dc:creator><author>墙头草</author><pubDate>Wed, 23 Apr 2008 17:15:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168458</guid><description><![CDATA[高深....<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">墙头草</a> 2008-04-24 01:15 <a href="http://www.cnblogs.com/ILove/archive/2008/04/24/1168454.html#1168458#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你为什么会慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/21/1157229.html#1163954</link><dc:creator>ddd</dc:creator><author>ddd</author><pubDate>Mon, 21 Apr 2008 07:14:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/21/1157229.html#1163954</guid><description><![CDATA[@二手的程序员<br>你的概念有问题 全部编译成机器码和以后执行有什么关系呢 编译成的机器码又不是要存在某个地方想用的时候就去调它<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">ddd</a> 2008-04-21 15:14 <a href="http://www.cnblogs.com/ILove/archive/2008/04/21/1157229.html#1163954#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你为什么会慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/19/1157229.html#1160678</link><dc:creator>二手的程序员</dc:creator><author>二手的程序员</author><pubDate>Fri, 18 Apr 2008 16:13:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/19/1157229.html#1160678</guid><description><![CDATA[@Anytao<br>我是指当程序在客户机器上setup之后,能不能马上就全部被jit编译成机器码,这样程序以后执行会不会快一些<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">二手的程序员</a> 2008-04-19 00:13 <a href="http://www.cnblogs.com/ILove/archive/2008/04/19/1157229.html#1160678#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你为什么会慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1160628</link><dc:creator>Anytao</dc:creator><author>Anytao</author><pubDate>Fri, 18 Apr 2008 15:21:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1160628</guid><description><![CDATA[@二手的程序员<br>没有完全了解你的意思，不过微软同时提供了ngen.exe（Native Image Gererator)工具，用于取代JIT编译在程序集执行之前编译。不过，ngen.exe只考虑用在特殊的场合，更推荐以JIT进行及时编译:-)<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">Anytao</a> 2008-04-18 23:21 <a href="http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1160628#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你为什么会慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1160436</link><dc:creator>二手的程序员</dc:creator><author>二手的程序员</author><pubDate>Fri, 18 Apr 2008 13:04:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1160436</guid><description><![CDATA[问一下,有没有办法让程序部署完之后就被JIT全部编译一下.<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">二手的程序员</a> 2008-04-18 21:04 <a href="http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1160436#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你为什么会慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1160383</link><dc:creator>想酷就要勤</dc:creator><author>想酷就要勤</author><pubDate>Fri, 18 Apr 2008 12:16:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1160383</guid><description><![CDATA[1楼的mm成了大家评论的焦点了，呵呵<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">想酷就要勤</a> 2008-04-18 20:16 <a href="http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1160383#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你为什么会慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1160245</link><dc:creator>Micro.z</dc:creator><author>Micro.z</author><pubDate>Fri, 18 Apr 2008 09:50:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1160245</guid><description><![CDATA[不错了哈！~ 我知道了些东西！~<br><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">Micro.z</a> 2008-04-18 17:50 <a href="http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1160245#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你为什么会慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1159916</link><dc:creator>Freewind</dc:creator><author>Freewind</author><pubDate>Fri, 18 Apr 2008 06:32:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1159916</guid><description><![CDATA[学习....<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">Freewind</a> 2008-04-18 14:32 <a href="http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1159916#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你为什么会慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1159759</link><dc:creator>Da Vinci</dc:creator><author>Da Vinci</author><pubDate>Fri, 18 Apr 2008 05:16:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1159759</guid><description><![CDATA[@Anytao<br>Anytao强<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">Da Vinci</a> 2008-04-18 13:16 <a href="http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1159759#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你为什么会慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1159356</link><dc:creator>Anytao</dc:creator><author>Anytao</author><pubDate>Fri, 18 Apr 2008 02:01:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1159356</guid><description><![CDATA[补充：MSCorEE.dll中的代码来启动CLR并做一些初始工作，这些初始化主要包括：<br><br>1 创建内存；<br>2 创建线程池；<br>3 创建应用程序域名。<br><br>关于性能，.NET其实已经有很多优化策略，其自动内存管理上有诸多的优化机制，相比原生态的C代码来说在某些方面甚至表现更优。不管怎样，现在是托管环境的时代，我们越发的了解托管环境，也就能更好的控制性能。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">Anytao</a> 2008-04-18 10:01 <a href="http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1159356#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你为什么会慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1159070</link><dc:creator>镜涛</dc:creator><author>镜涛</author><pubDate>Thu, 17 Apr 2008 19:14:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1159070</guid><description><![CDATA[呵呵，学习一下。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">镜涛</a> 2008-04-18 03:14 <a href="http://www.cnblogs.com/ILove/archive/2008/04/18/1157229.html#1159070#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你究竟有多慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158925</link><dc:creator>没有昵称</dc:creator><author>没有昵称</author><pubDate>Thu, 17 Apr 2008 14:51:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158925</guid><description><![CDATA[呵呵，，，好像很多朋友在这里研究起来谁快谁慢的问题了，呵呵，离题了离题了。<br><br>不过，既然这个问题这么敏感，那我就顺便贴两个地址，各位可以看一下这位仁兄在遇到问题的时候是怎样处理的。<br>先看这个：<a target=_blank  href="http://www.cnblogs.com/wuchang/archive/2006/12/07/584997.html" target="_new">http://www.cnblogs.com/wuchang/archive/2006/12/07/584997.html</a><br>再看这个：<a target=_blank href="http://eparg.spaces.live.com/blog/cns!59bfc22c0e7e1a76!2274.entry">http://eparg.spaces.live.com/blog/cns!59bfc22c0e7e1a76!2274.entry</a><br><br>这位仁兄的做法很值得我们思考。他在发现问题的时候第一反应是去分析问题找原因，并最终拨开迷云找到了事情的真相。相信也正是这样的探索精神让这位仁兄成为一个大牛的。 <br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">没有昵称</a> 2008-04-17 22:51 <a href="http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158925#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你究竟有多慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158876</link><dc:creator>没有昵称</dc:creator><author>没有昵称</author><pubDate>Thu, 17 Apr 2008 14:20:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158876</guid><description><![CDATA[@研究者<br>er，，，我确实是仔细的看了两天资料确认了之后才写出来的啊。<br>不过如果帅哥觉得我说的不对，你可以告诉我错在哪里么？我也好继续学习。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">没有昵称</a> 2008-04-17 22:20 <a href="http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158876#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你究竟有多慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158813</link><dc:creator>techmango</dc:creator><author>techmango</author><pubDate>Thu, 17 Apr 2008 13:36:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158813</guid><description><![CDATA[有这么复杂吗？！看了头晕啊<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">techmango</a> 2008-04-17 21:36 <a href="http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158813#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你究竟有多慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158660</link><dc:creator>GoGoSonny</dc:creator><author>GoGoSonny</author><pubDate>Thu, 17 Apr 2008 11:38:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158660</guid><description><![CDATA[VC6第一次启动快，但VS2005 2008下一次启动快！<br>比C++，有劣势，但也有优势。<br>对于JAVA，.NET没的说。<br>对于脚本，复杂的.NET有优势。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">GoGoSonny</a> 2008-04-17 19:38 <a href="http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158660#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: .Net，你究竟有多慢</title><link>http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158569</link><dc:creator>BlueMountain</dc:creator><author>BlueMountain</author><pubDate>Thu, 17 Apr 2008 10:09:00 GMT</pubDate><guid>http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158569</guid><description><![CDATA[@Da Vinci <br>就是说jit编译的结果的确是仅仅在内存中的，多谢！<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/ILove/" target="_blank">BlueMountain</a> 2008-04-17 18:09 <a href="http://www.cnblogs.com/ILove/archive/2008/04/17/1157229.html#1158569#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>