从派生指针调用虚函数而不支付vtable价格

jan*_*195 1 c++ polymorphism performance vtable

考虑这个简单的例子:

class Base {
    virtual void foo() {};  
};

class Derived: public Base {
    void foo() {}; 
}; 

Base    *b = new Derived;
Derived *d = new Derived;
b->foo();
d->foo();
Run Code Online (Sandbox Code Playgroud)

我的问题是:通过派生类指针调用在基类(但不在派生类中)中声明为虚拟的成员函数是否使用vtable机制(并付出代价)?在示例中b->foo()使用vtable机制来调用Derived::foo(),但是d->foo()

如果是,那么如何规避这种行为:当明确使用Derived指针时,我想直接调用该Derived::foo()方法而不支付vtable的成本,就像基类不存在一样?

Bri*_*ian 6

语法

d->Derived::foo();
Run Code Online (Sandbox Code Playgroud)

将禁止虚拟调度并保证该函数Derived::foo是被调用的函数,即使存在重写函数.

这很少是你想要的,但我不能建议其他解决方案,除非你解释为什么你要这样做.例如,在给出的代码片段中,没有理由Derived应该动态分配.你可以写这个:

Derived d;
d.foo();
Run Code Online (Sandbox Code Playgroud)

在这里,编译器确定动态类型是Derived,因此不需要虚拟调度.