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

时间:2014-07-13 22:23:50

标签: c++ inheritance vtable

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

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

1 个答案:

答案 0 :(得分: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() {};
};

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

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

enter image description here

在上图中你只是

  1. 关注对象的vptr(一个间接)
  2. 拨打您感兴趣的功能地址
  3. 现代编译器能够在上面列出的两点中优化此过程,除了一些特殊情况,这不会对性能产生显着影响。

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


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