-1

如果我在派生类实例上调用继承方法,代码是否需要使用 vtable?或者方法调用可以是“静态的”(不确定这是否是该词的正确用法)

例如:

Derived derived_instance;
derived_instance.virtual_method_from_base_class();

我正在使用 msvc,但我猜大多数主要编译器都以大致相同的方式实现这一点。

我(现在)知道该行为是特定于实现的,我对实现感到好奇。

编辑:

我应该补充一点,我们感兴趣的原因是该函数被调用了很多次,而且非常简单,而且我不允许以任何方式编辑函数本身,我只是想知道是否可以,以及无论如何消除动态调度是否有任何好处。

在你们都支持我的优化之前,我已经对功能等进行了分析和计算。

4

3 回答 3

3

您的两个示例都需要Derived具有接受 a 的构造函数Base并创建. 假设您有这样一个构造函数并且这是您想要的,那么编译器将“可能”能够静态确定动态对象类型并避免虚拟调用(如果它决定进行此类优化)。Derived

请注意,行为不是未定义的,它只是特定于实现的。两者之间有很大的不同。

如果您想避免创建新实例(或者,更有可能,这不是您想要的),那么您可以使用引用强制static_cast<Derived&>(base_instance).virtual_method_from_base_class();转换,但是虽然这可以避免创建新对象,但它不允许您避免虚拟调用。

如果您真的想在编译时进行转换,那么您正在寻找的很可能是 CRTP http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern,它允许您在编译时键入所有内容,避免虚拟调用。

编辑更新的问题:在您现在展示的情况下,我怀疑许多编译器能够静态确定动态类型并避免虚拟调用。

于 2012-08-08T16:08:12.323 回答
0

Vtable 仅在您使用指针或引用时发挥作用。对于对象,它总是被调用的特定类方法。

于 2012-08-08T16:07:08.037 回答
0

您可以简单地限定调用,然后没有虚函数调度:

Derived derived_instance;
derived_instance.Derived::virtual_method_from_base_class();

但是,我怀疑那将是过早的优化

测量

于 2012-08-08T16:31:40.983 回答