如果我有一个界面:
interface IMyInterface
{
void DoSomething();
}
和一个实现类:
class MyClass : IMyInterface
{
public void DoSomething()
{
}
}
DoSomething 是内联的候选者吗?我期望“否”,因为如果它是一个接口,那么该对象可能会被转换为 IMyInterface,因此被调用的实际方法是未知的。但事实上,它没有标记为 virtual 意味着它可能不在 vtable 上,所以如果该对象被强制转换为 MyClass,那么也许它可以被内联?
如果你打电话DoSomething
那么它将直接成为内联的候选者(取决于该方法是否满足与大小等相关的其他内联标准)。
如果你打电话DoSomething
通过接口,那么它将不会被内联。接口提供的间接寻址会导致虚拟调用需要 vtable 查找,因此 JIT 编译器无法内联它,因为实际的调用点仅在运行时解析。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)