gpt4 book ai didi

c++ - 基类的 Virtual-and-final 函数成本(vtable/virtual-cost)

转载 作者:太空狗 更新时间:2023-10-29 21:35:19 28 4
gpt4 key购买 nike

virtual final 函数(final 在基类)是否有任何 vtable/virtual 成本?

class B{
public: virtual void fFinal() final{ .... do something ..... }
public: void fCheap() { .... do something ..... }
public: virtual void fVirtual() { .... do something ..... }
};
class C : public B{
public: virtual void fVirtual() { .... do something ..... }
};

fFinal() 的成本是否等于 fCheap()fVirtual() 的成本?

我将使用 final+virtual 来防止人为错误(“不要覆盖我”)。
fCheap() 不是那么安全,因为我仍然可以隐藏父函数。

以下这些链接不提供答案。

最佳答案

据我所知,任何特定的编译器是如何实现虚函数机制的都是未指定的。如果类至少有一个虚函数,即使这个虚函数被标记为 final,他们也很有可能将指向 vtable 的指针放入类中。

我已经根据您的代码片段测试了一个简化示例:

class Base {
public:
virtual void foo() final {}
};

static_assert(sizeof(Base) > 1, "No pointer to vtable");

似乎gcc 6.3clang 4.0添加指向 vtable 的指针。

这意味着管理普通虚函数的规则适用于在基类中标记为 virtual 和 final 的函数。因此,Base 类的大小会增加,并且当您通过指向 Base 类或派生自的某个类的指针/引用调用 fooBase,您需要为通过 vtable 重定向支付一些额外费用。

关于c++ - 基类的 Virtual-and-final 函数成本(vtable/virtual-cost),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42884487/

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