【问题标题】:Methods of dynamic dispatch [duplicate]动态调度方法[重复]
【发布时间】:2014-08-08 13:36:36
【问题描述】:

讨论

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

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

问题

Q1. 除了vtables 和vptrs 之外,还有其他有效的方法可以实现动态调度吗?

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

【问题讨论】:

    标签: c++ c++11 dynamic-dispatch


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多