C 虚拟函数何时派生类是最终的
C++ virtual function inlining when derived class is final?
我在嵌入式环境中使用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的编译器资源管理器对于了解可能发生哪些特定优化以及如何失败很有用。
相关文章:
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 大小虚拟继承中的派生类
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 虚拟基类函数中派生类的大小
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 派生类中纯虚拟基方法的专业化
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- 无法在派生对象上运行虚拟函数
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 从基调用派生类的隐藏(非虚拟)方法
- 派生类可以有多个指向虚拟表的指针
- 如何从派生类函数中调用虚拟函数
- C++虚拟函数:基类函数是调用的,而不是派生的
- 空类的大小和派生虚拟类
- C++ STL:使用派生虚拟类作为 std::sort() 的"Strict Weak Ordering"