【发布时间】:2017-09-29 09:07:08
【问题描述】:
考虑这个简单的例子:
class Base {
virtual void foo() {};
};
class Derived: public Base {
void foo() {};
};
Base *b = new Derived;
Derived *d = new Derived;
b->foo();
d->foo();
我的问题是:通过派生类指针调用基类(但不是派生类)中声明为虚拟的成员函数是否使用(并为此付出代价)vtable 机制?例子中b->foo()使用vtable机制调用Derived::foo(),但是d->foo()?
如果是,如何规避这种行为:当显式使用Derived指针时,我想直接调用Derived::foo()方法而不支付vtable的成本,就好像基类不存在一样?
【问题讨论】:
-
您的实际问题是什么? 为什么你想回避 vtable 查找?您是否测量过这是您应用程序中的一个严重瓶颈?这不仅仅是因为你听到或读过的东西而过早优化?
-
如果您想确保从
Derived继承的类不会覆盖foo,您可以使用final关键字。如果这样做,编译器可能会在对Derived*调用foo()时优化 vtable 查找。 -
我想过这个final关键字,但是如何检查优化器是否真的跳过了vtable?
-
编译器尝试优化虚拟调度并尽可能删除间接。 Gcc 在这个方向上已经有了很大的改进。您可以在其中一位 gcc 开发人员的一系列精彩文章中阅读到很多关于它的信息:hubicka.blogspot.de/2014/01/devirtualization-in-c-part-1.html
-
"我想过这个final关键字,但是如何检查优化器是否真的跳过了vtable?"查看为此生成的汇编代码。
标签: c++ performance polymorphism vtable