2

讨论

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

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

问题

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

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

4

1 回答 1

2

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

即使有两个实现,动态编译器也可能产生类似“if (object uses implementation X) { inlined_code_for_x (); } else { recompile_this_code (); }

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

于 2014-08-08T14:05:04.000 回答