讨论
我知道,我知道的所有实现(即C++编译器)都是通过使用虚拟调度表和虚拟表指针(即已知的vtable和vptr)来实现动态调度机制的。
然而,在询问C++标准时,我发现C++标准并没有明确要求如何实现动态调度。这意味着供应商可以使用另一种动态调度方法,只要其行为符合C++标准对动态调度行为的要求。
问题
Q1.除了
vtable和vptr之外,还有其他有效的方法可以实现动态调度吗? Q2. If Q1是真的:如果有什么原因,使实现者决定使用vtables和vptrs来实现动态调度而不是其他有效的方法?
发布于 2014-08-08 14:05:04
Q1:动态编译器可以比使用vtable更快地实现虚拟函数。假设一个方法是虚拟的,但是到目前为止创建的所有对象都使用实现X。动态编译器将直接调用实现X,甚至内联它。当创建一个使用不同实现的对象时,所有可能出错的代码都将被重新编译。
即使有两个实现,动态编译器也可能生成类似于"if (object使用实现X) { inlined_code_for_x ();} else { recompile_this_code ();}“之类的代码。
Q2:一个潜在的原因是:如果您有一个具有许多虚拟函数和大型vtable的基类,以及许多很少覆盖这些虚拟函数的派生类,那么对每个类都使用相同的vtable是效率低下的。无论是从内存的角度来看,还是从执行的角度来看,都是可能的,因为如果指向同一个函数的指针存储在不同的内存位置,那么某些处理器优化就无法工作。
https://stackoverflow.com/questions/25204803
复制相似问题