【发布时间】:2013-09-25 19:54:25
【问题描述】:
向某人解释虚拟调度很容易:每个对象都有一个指向表的指针作为其数据的一部分。类上有 N 个虚方法。对特定方法的每次调用都会在对象到达时索引对象并调用表中的第 i 个方法。每个实现方法 X() 的类都将在相同的第 i 个索引中包含方法 X() 的代码。
然后我们得到接口。并且接口需要某种形式的扭曲,因为实现相同接口的两个非继承类将在表的不同索引中具有虚函数。
我在网上搜索了很多关于如何实现接口调度的讨论。有两大类: a) 某种哈希表在对象上查找以找到正确的调度表 b) 当对象被强制转换为接口时,会创建一个新指针,该指针指向相同的数据,但指向不同的 vtable。
但是,尽管有很多关于它如何 工作的信息,但我找不到任何关于 .NET 运行时引擎如何实际实现它的信息。
有没有人知道描述当对象类型是接口时在 callvirt 指令中发生的实际指针运算的文档?
【问题讨论】:
-
颤抖吧,凡人……全能的飞碟接近了。
-
为了增加更多的魔力,单一类型可以实现任意数量的接口(例如,给定
interface ISelf<T> {T GetMe();},像class bob : ISelf<bob>这样的类不仅可以实现@987654323 @,还有ISelf<ISelf<bob>>、ISelf<ISelf<ISelf<bob>>>等到任何所需的嵌套级别,并且与每个接口关联的GetMe()方法将“知道”它的返回类型。 -
@supercat 我从来没有想过这个问题。那是……出乎意料。这意味着通过泛型,即使没有动态加载,类型表也有些动态。我得看看那个。谢谢。