gpt4 book ai didi

c++ - 'final' 说明符是否会增加任何开销?

转载 作者:可可西里 更新时间:2023-11-01 17:01:33 31 4
gpt4 key购买 nike

classfunction 上使用说明符 final 会增加任何内存或 cpu 开销,还是仅在编译时使用?

std::is_final 是如何识别 final 的?

最佳答案

它实际上可以减少开销。在极少数情况下,增加它。

如果您有一个指向finalA 的指针,任何虚方法调用都可以去虚化并直接调用。同样,可以去虚拟化对虚拟 final 方法的调用。此外,final 类的继承树是固定的,即使它包含 virtual 父类,所以您可以去虚拟化一些父类访问。

这些去虚拟化中的每一个都减少或消除了查询运行时结构(vtable)的要求。

可能会有轻微的缺点。一些编码技术依赖于 vtable 访问来避免直接访问符号,然后不导出符号。访问 vtable 可以通过约定完成(没有库中的符号,只有相关类的头文件),而直接访问方法涉及链接到该符号。

这打破了动态 C++ 库链接的一种形式(在这种情况下,您避免链接的不仅仅是一个 dll 加载符号和/或返回指针的 C 链接函数,并且类通过它们的 vtables 导出)。

如果您链接动态库中的符号,动态库符号加载也可能比 vtable 查找更昂贵。我没有经历过或描述过这个,但我看到它声称。一般而言, yield 应超过此类成本。任何此类成本都是实现质量问题,因为成本不是强制发生的,因为该方法是 final

最后,final 禁止类上的空基优化技巧,在这种情况下,有人知道您的类没有状态,并继承它以减少“存储”您的类实例的开销 1字节到 0 字节。如果您的类是空的并且不包含虚方法/继承,请不要使用 final 以避免被阻止。 final 函数没有等效项。

除了 EBO 优化问题(只发生在空类型上),final 的任何开销都来自于其他代码如何与它交互,而且这种情况很少见。更多时候,它会使其他代码更快,因为直接与方法交互可以更直接地调用该方法,并且可以导致链式优化(因为编译器可以更充分地理解调用)。

将除空类型之外的任何内容标记为 final 当它是 final 时几乎肯定在运行时是无害的。对具有虚函数和继承的类执行此操作可能在运行时有益。


std::is_final 和类似的特征几乎都是通过编译器内置的魔法实现的。 std 中的许多特性都需要这样的魔法。参见 How to detect if a class is final in C++11? (感谢@Csq 发现)

关于c++ - 'final' 说明符是否会增加任何开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31967725/

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