c++ - 从派生指针调用虚函数而不支付 vtable 价格

标签 c++ performance polymorphism vtable

考虑这个简单的例子:

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,就好像基类不存在一样?

最佳答案

语法

d->Derived::foo();

将抑制虚拟调度并保证函数 Derived::foo 是被调用的函数,即使存在覆盖函数也是如此。

这很少是您想要的,但我不能建议替代解决方案,除非您解释为什么要尝试这样做。例如,在给定的代码片段中,根本没有理由要动态分配 Derived。你可以这样写:

Derived d;
d.foo();

在这里,编译器肯定知道动态类型是Derived,因此不需要虚拟分派(dispatch)。

关于c++ - 从派生指针调用虚函数而不支付 vtable 价格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46485477/

相关文章:

performance - 存储过程执行时间不正确

java - java继承覆盖变量的解释

c++ - 具有来自类层次结构的参数的多态函数

c++ - 如何在其他 src 文件夹中包含头文件

c++ - 在 getline() 之后获取字符串

c++ - 抽象类类型的无效新表达式

SELECT 子句中的 MySQL 自定义函数非常慢

c++ - 使用Win32 API时,要使用哪些数据类型?

performance - RSA、ManagedRijndael 和 Managed AES 在 C# 中的性能差异比较

java - JPA/toplink 异构实体列表