向某人解释虚拟调度很容易:每个对象都有一个指向表的指针作为其数据的一部分。类上有 N 个虚方法。对特定方法的每次调用都会在对象到达时索引对象并调用表中的第 i 个方法。每个实现方法 X() 的类都将在相同的第 i 个索引中包含方法 X() 的代码。
但随后我们得到了接口。接口需要某种扭曲,因为两个实现相同接口的非继承类将在表的不同索引中具有虚函数。
我在网上搜索了很多关于如何实现接口调度的讨论。有两大类:a)某种哈希表在对象上查找以找到正确的调度表 b)当对象被强制转换到接口时,会创建一个指向相同数据但指向不同数据的新指针虚表。
但是,尽管有很多关于它如何工作的信息,但我找不到任何关于 .NET 运行时引擎如何实际实现它的信息。
有谁知道描述当对象类型是接口时在 callvirt 指令中发生的实际指针算术的文档?