我知道虚函数的vtable查找比直接函数调用慢很多,因为基类必须搜索vtable来获取派生函数。如果有更多的派生层,如果它会更慢,我就会徘徊。基本上,我的问题如下:
基础 - > 派生(1层继承)虚拟函数调用速度快于 的基 - >的 Derived1 - >的 Derived2的 - >的 Derived3 - >的 DerivedEtc (多层)虚函数调用?
答案 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
的对象。
这里重要的一点是,您不需要从基础遍历所有虚拟表,以找到要为特定对象调用的函数:
在上图中你只是
vptr
(一个间接)现代编译器能够在上面列出的两点中优化此过程,除了一些特殊情况,这不会对性能产生显着影响。
致谢:http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/
额外:正如dyp指出的那样," 性能缓慢"虚函数通常是指由于vtable间接而无法内联这些函数的事实。这是否重要,实际上归结为您正在处理的代码和架构(例如注册压力和其他因素)。