sgt*_*ale 2 c++ inheritance vtable
我知道vtable查找虚函数要比直接函数调用慢很多,因为基类必须搜索vtable来获取派生函数.如果有更多的派生层,如果它会更慢,我就会徘徊.基本上,我的问题如下:
是基础 - > 衍生的(1层继承)虚拟函数调用的速度比 基 - > Derived1 - > Derived2的 - > Derived3 - > DerivedEtc(多层)虚拟函数调用?
在两级继承派生类而不是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.
这里重要的要点是,您不需要从基础遍历所有虚拟表,以找到要为特定对象调用的函数:

在上图中你只是
vptr你的对象(一个间接)现代编译器能够在上面列出的两点中优化这个过程,除了一些特殊情况,这不会显着影响性能.
致谢:http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/
额外:正如dyp所指出的,虚函数的" 慢性能 "通常是指由于vtable间接而无法内联这些函数的事实.这是否重要,实际上归结为您正在处理的代码和架构(例如注册压力和其他因素).
| 归档时间: |
|
| 查看次数: |
646 次 |
| 最近记录: |