动态调度方法

Methods of dynamic dispatch

本文关键字:方法 动态调度      更新时间:2023-10-16

讨论

我知道,我所知道的所有实现(即C++编译器(都通过使用虚拟调度表虚表指针(即已知的vtablevptr(来实现动态调度机制。

然而,在询问C++标准时,我发现C++标准并没有明确规定必须如何实现动态调度。这意味着,供应商可以使用一种替代方法进行动态调度,前提是其行为符合C++标准对动态调度行为的要求。

问题

Q1。除了vtable s和vptr s之外,还有其他有效的方法可以实现动态调度吗?

Q2。如果Q1为真:是什么原因(如果有的话(使实现者决定使用vtablevptr来实现动态调度,而不是其他有效的方法?

Q1:动态编译器可以比使用vtable更快地实现虚拟函数。假设一个方法是虚拟的,但到目前为止创建的所有对象都使用实现X。动态编译器将直接调用实现X,甚至内联它。当创建使用不同实现的对象时,所有现在可能错误的代码都将重新编译。

即使有两个实现,动态编译器也可能生成类似于"if(object使用实现X({inlined_code_for_X((;}else{recompile_this_code((;}

Q2:一个潜在的原因:如果你有一个基类,它有很多虚拟函数和一个巨大的vtable,还有很多派生类很少覆盖这些虚拟函数,那么每个类都有相同的vtable是低效的。从内存的角度来看,从执行的角度来看都是潜在的,因为如果指向同一函数的指针存储在不同的内存位置,某些处理器优化就不起作用。