IL为调用函数提供了两个语句,即call和callvirt.调用用于调用非虚函数或静态函数或编译器不希望对引用进行空检查的任何函数.
callvirt用于调用虚函数,也调用非虚函数,因为编译器在运行时对引用进行空检查.
现在,当通过C#进行CLR时,我发现了以下示例.
internal class SomeClass
{
public override String ToString()
{
return base.ToString();
}
}
现在ToString()是虚函数,但是编译器为它生成了调用指令.但杰弗里提到为什么没有生成callvirt的原因是因为在这种情况下ToString()会被递归调用并导致StackOverFlow异常,我试图理解,但无法围绕这个想法?任何人都可以解释为什么它会导致递归调用?
谢谢..
解决方法:
据我所知,如果编译器生成callvirt,会发生stackoverflow异常,因为:
有些代码调用someclass类型的对象的ToString,它继承自类对象.
* somclass“方法的ToString调用它的基类的ToString方法,它是对象.
如果此调用是虚拟的,则不会导致从类对象调用ToString,而是调用实际类(即SomeClass)的ToString.
然后你就会处于一个不定式的循环中,因为现在整个事情将从新的开始.
标签:c,net,cil 来源: https://codeday.me/bug/20190701/1343602.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。