C 虚拟函数何时派生类是最终的

C++ virtual function inlining when derived class is final?

本文关键字:派生 虚拟 函数 何时      更新时间:2023-10-16

我在嵌入式环境中使用C ,在该环境中,虚拟函数的运行时确实很重要。我已经阅读了罕见的情况,例如,虚拟函数可以被嵌入,例如:内联虚拟函数真的是无意义的吗?接受的答案指出,只有在运行时知道确切的类时,才有可能,例如,在处理本地,全局或静态对象时(不是指针或对基本类型的指针(。我了解此背后的逻辑,但是我想知道在以下情况下是否也可以进行内部:

class Base {
    public:
        inline virtual void x() = 0;
}
class Derived final : Base {
    public:
        inline virtual void x(){
            cout << "inlined?";
        }
}
int main(){
    Base* a;
    Derived* b;
    b = new Derived();
    a = b;
    a->x(); //This can definitely not be inlined.
    b->x(); //Can this be inlined?
}

从我的角度来看,编译器应该在编译时知道a的确定类型,因为它是最终类。在这种情况下,是否可以嵌入虚拟函数?如果没有,那为什么呢?如果是,那么GCC兼态器(分别为AVR-GCC(会这样做吗?

谢谢!

第一步称为devirtualization;函数调用不会通过虚拟调度。

编译器可以并且可以使最终类的最终方法和方法不断变化。这几乎是最后的重点。

一旦脱发,可以将方法夹住。

一些编译器有时可以证明*a的静态类型,甚至可以使它变性化。这是不太可靠的。Godbolt的编译器资源管理器对于了解可能发生哪些特定优化以及如何失败很有用。