我知道我所知道的所有实现(即C ++编译器)都通过使用虚拟调度表和虚拟表指针来实现dynamic dispatch机制(即已知的vtable
和vptr
)。
然而,在查询C ++标准时,我发现C ++标准并未明确规定必须如何实现动态调度。这意味着供应商可以使用替代方法进行动态调度,前提是其行为符合C ++标准对动态调度行为的要求。
Q1。除了
vtable
和vptr
之外,还有其他有效方法可以实现动态调度吗?Q2。如果 Q1 为真:导致实施者决定使用
vtable
和vptr
的原因是什么(如果有的话) s实现动态调度而不是其他一些有效的方法?
答案 0 :(得分:2)
Q1:动态编译器可以比使用vtable更快地实现虚拟功能。假设一个方法是虚拟的,但到目前为止创建的所有对象都使用实现X.动态编译器将生成对实现X的直接调用,甚至内联它。当创建使用不同实现的对象时,将重新编译现在可能出错的所有代码。
即使有两个实现,动态编译器也可以生成类似" if(对象使用实现X){inlined_code_for_x(); } else {recompile_this_code(); }
Q2:一个潜在的原因:如果你有一个具有许多虚函数和一个巨大的vtable的基类,以及许多很少覆盖任何这些虚函数的派生类,那么每个类具有相同的vtable是低效的。从存储器的角度来看,以及从执行的角度来看都是潜在的,因为如果指向相同功能的指针存储在不同的存储器位置,则某些处理器优化不起作用。