多重继承,虚函数和C++中的虚拟表

sgt*_*ale 2 c++ inheritance vtable

我知道vtable查找虚函数要比直接函数调用慢很多,因为基类必须搜索vtable来获取派生函数.如果有更多的派生层,如果它会更慢,我就会徘徊.基本上,我的问题如下:

基础 - > 衍生的(1层继承)虚拟函数调用的速度比 - > Derived1 - > Derived2的 - > Derived3 - > DerivedEtc(多层)虚拟函数调用?

Mar*_* A. 6

在两级继承派生类而不是40级继承派生类的情况下,单间接查找的性能与查找要调用的虚函数没有区别.

原因如下:每个类都有一个指向虚拟表的指针,该表用于解析需要为该特定对象调用哪个函数:

class Base
{
public:
    virtual void function1() {};
    virtual void function2() {};
};

class D1: public Base
{
public:
    virtual void function1() {};
};

class D2: public Base
{
public:
    virtual void function2() {};
};
Run Code Online (Sandbox Code Playgroud)

上面的代码生成了三个虚拟表:一个用于类的对象Base,一个用于类的对象,一个用于类D1的对象D2.

这里重要的要点是,您不需要从基础遍历所有虚拟表,以找到要为特定对象调用的函数:

在此输入图像描述

在上图中你只是

  1. 跟随vptr你的对象(一个间接)
  2. 调用您感兴趣的函数的地址

现代编译器能够在上面列出的两点中优化这个过程,除了一些特殊情况,这不会显着影响性能.

致谢:http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/


额外:正如dyp所指出的,虚函数的" 慢性能 "通常是指由于vtable间接而无法内联这些函数的事实.这是否重要,实际上归结为您正在处理的代码和架构(例如注册压力和其他因素).