C ++ - 虚拟方法会导致非虚方法调用的开销吗?

时间:2017-06-23 18:00:05

标签: c++ inheritance vtable overhead virtual-method

理论上,使用虚方法的类的总体开销是多少。开销是限于对虚拟方法的调用还是其他非虚拟方法也会遭受开销?

例如,当一个类具有虚拟析构函数但所有其他方法都是非虚拟的时。

class Vehicle
{ 
    int mass;

    public:
    Vehicle(int mass) : mass(mass) {}
    virtual ~Vehicle() {}
    int getMass() { return mass; }
};

class Car : public Vehicle 
{
    WheelSet* wheels;

    Car(WheelSet* ws) : Vehicle(1500), wheels(ws) {}
    ~Car() { delete wheels; }
    int getWheelCount() { return wheels->count; }
}

int main()
{
    Car* car = new Car(new WheelSet());
    Vehicle* v = car;

    int a = c->getWheelCount();  // calls non-virtual derived method
    int b = c->getMass();  // calls non-virtual base method from derived pointer
    int c = v->getMass();  // calls non-virtual base method from base pointer

    delete v;  // calls virtual method (the destructor)
}

调用这些非虚方法时是否有任何开销?或者只有虚方法调用有开销(在这种情况下调用析构函数)?

编辑:

这个问题的关键是要知道虚函数的存在是否会影响其他非虚方法的性能。此论坛上的其他问题已经提供了有关虚拟/非虚拟/内联方法的性能比较的答案。

0 个答案:

没有答案