【发布时间】:2014-07-13 22:23:49
【问题描述】:
我知道虚函数的 vtable 查找比直接调用函数要慢很多,因为基类必须搜索 vtable 以获取派生函数。如果有更多的派生层,我在徘徊是否会更慢。基本上,我的问题如下:
Base->Derived(1层继承)虚函数调用速度比 Base->Derived1->Derived2->Derived3->DerivedEtc(多个层)虚函数调用?
【问题讨论】:
-
如果继承是静态的,即非虚拟的,则没有搜索。动态分派是单表查找。使用虚拟继承,您只需添加一个额外的间接步骤。
-
“我知道查找虚函数的 vtable 比直接调用函数要慢很多,因为基类必须搜索 vtable 以获取派生函数。”根据TR Performance,虚函数调用通常不会比普通函数调用慢多少。你付出的代价主要是你不能内联这个函数调用。 “想要性能?衡量。”
-
简短答案:否。长答案:*.com/questions/5868431/… 另外请注意,从长答案中可以看出,表格不必“搜索”。这是在编译时已知的索引查找。
-
继承的层数无关紧要。只有最派生的函数地址会放在 vtable 中,因此访问速度同样快。请注意,初始化期间的构造函数或析构函数不一定是这种情况。
标签: c++ inheritance vtable