动态调度方法
Methods of dynamic dispatch
讨论
我知道,我所知道的所有实现(即C++编译器(都通过使用虚拟调度表和虚表指针(即已知的vtable
和vptr
(来实现动态调度机制。
然而,在询问C++标准时,我发现C++标准并没有明确规定必须如何实现动态调度。这意味着,供应商可以使用一种替代方法进行动态调度,前提是其行为符合C++标准对动态调度行为的要求。
问题
Q1。除了
vtable
s和vptr
s之外,还有其他有效的方法可以实现动态调度吗?Q2。如果Q1为真:是什么原因(如果有的话(使实现者决定使用
vtable
和vptr
来实现动态调度,而不是其他有效的方法?
Q1:动态编译器可以比使用vtable更快地实现虚拟函数。假设一个方法是虚拟的,但到目前为止创建的所有对象都使用实现X。动态编译器将直接调用实现X,甚至内联它。当创建使用不同实现的对象时,所有现在可能错误的代码都将重新编译。
即使有两个实现,动态编译器也可能生成类似于"if(object使用实现X({inlined_code_for_X((;}else{recompile_this_code((;}
Q2:一个潜在的原因:如果你有一个基类,它有很多虚拟函数和一个巨大的vtable,还有很多派生类很少覆盖这些虚拟函数,那么每个类都有相同的vtable是低效的。从内存的角度来看,从执行的角度来看都是潜在的,因为如果指向同一函数的指针存储在不同的内存位置,某些处理器优化就不起作用。
相关文章:
- 动态调度到模板函数C++
- openMp 动态调度与按处理时间排序任务时的 LPT 调度相同吗?
- 是否会动态调度在具有 vtable 的类上调用非虚函数
- 带有模板类和动态调度的C 共享_POINTER
- 如何用虚拟方法动态实现类
- C++或D:在没有动态调度的情况下解耦类的习惯用法
- 从net.connman.Manager的GetService方法动态提取D-Bus参数和对象路径
- C++动态调度和后期绑定有什么区别
- 动态调度是如何在程序集中发生的
- 为什么动态调度比 openmp 中的静态调度更快
- 动态调度在类外部声明的方法
- C++避免使用 using 关键字在派生类中进行动态调度
- OpenMP:循环'std::map'基准测试(动态调度)
- C++中动态调度的规则是什么?
- O'Reilly "Objective-C Pocket Reference"声称C++不支持动态调度,这是真的吗?
- 动态调度方法
- 释放类的实例是否也会释放由其对象/方法动态分配的内存?
- 针对不相关类型的动态调度的解决方案
- 模板函数的动态调度
- 动态调度哪些函数