是否引用类引用接口会产生任何开销?

时间:2011-05-03 20:06:07

标签: .net interface casting clr

在谈到铸造时,我的意思是隐式演员。假设B类继承自A.因为我们在C#中只有单继承,当引用B引用引用A时,我们不必做任何这个''指针调整等等。实际上,这样的强制转换不是操作,因为B A,A的所有字段在A对象和B对象中都有相同的偏移量。

还有一个问题:是否正在引用B来引用B实现的某个接口涉及任何开销?就个人而言,我没有看到任何理由,因为接口不能有字段(因此,这个''指针不必像上面的情况那样进行调整)。然而,有时我可以听到这样的意见,因此这个问题。

1 个答案:

答案 0 :(得分:2)

有两项费用:

  • 将引用复制到其他位置的成本。这显然很小:)
  • 执行真正虚拟方法调用的潜在成本,否则这些调用可能是非虚拟的。

对于后者,我说的是JIT优化。请考虑以下代码:

string x = "hello";
object o = x;
string y = o.ToString();

我怀疑JIT最终会得到一个真正的虚拟方法调用,带有vtable查找等。没有内联的可能性。

如果我们要调用x.ToString(),我希望JIT注意到String是最后一个类,因此String.ToString的实现不可能是进一步覆盖 - 允许在没有vtable查找的情况下进行调用,也可能内联。

这是猜测,但这是值得思考的事情。将对象视为更一般的类型的成本比复制引用的成本更有可能。