gpt4 book ai didi

c++ - 调用非虚拟基方法时,C++ 中的虚拟继承是否有任何惩罚/成本?

转载 作者:IT老高 更新时间:2023-10-28 21:39:01 25 4
gpt4 key购买 nike

当我们从其基类调用 常规函数 成员时,在 C++ 中使用虚拟继承是否会在编译代码中产生运行时损失?示例代码:

class A {
public:
void foo(void) {}
};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};

// ...

D bar;
bar.foo ();

最佳答案

是的,如果您通过指针或引用调用成员函数并且编译器无法绝对确定该指针或引用指向或引用的对象类型,则可能存在。例如,考虑:

void f(B* p) { p->foo(); }

void g()
{
D bar;
f(&bar);
}

假设对f的调用没有内联,编译器需要生成代码找到A虚拟基类子对象的位置,以便调用。通常这种查找涉及检查 vptr/vtable。

如果编译器知道您调用函数的对象的类型(如您的示例中的情况),则应该没有开销,因为函数调用可以静态分派(dispatch)(在编译时)。在您的示例中, bar 的动态类型已知为 D (不能是其他任何东西),因此虚拟基类子对象 的偏移量A 可以在编译时计算。

关于c++ - 调用非虚拟基方法时,C++ 中的虚拟继承是否有任何惩罚/成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5553850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com