首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态调度方法

动态调度方法
EN

Stack Overflow用户
提问于 2014-08-08 13:36:36
回答 1查看 1.6K关注 0票数 2

讨论

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

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

问题

Q1.除了vtablevptr之外,还有其他有效的方法可以实现动态调度吗? Q2. If Q1是真的:如果有什么原因,使实现者决定使用vtables和vptrs来实现动态调度而不是其他有效的方法?

EN

回答 1

Stack Overflow用户

发布于 2014-08-08 14:05:04

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

即使有两个实现,动态编译器也可能生成类似于"if (object使用实现X) { inlined_code_for_x ();} else { recompile_this_code ();}“之类的代码。

Q2:一个潜在的原因是:如果您有一个具有许多虚拟函数和大型vtable的基类,以及许多很少覆盖这些虚拟函数的派生类,那么对每个类都使用相同的vtable是效率低下的。无论是从内存的角度来看,还是从执行的角度来看,都是可能的,因为如果指向同一个函数的指针存储在不同的内存位置,那么某些处理器优化就无法工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25204803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档