我在虚拟功能的运行时很重要的嵌入式环境中使用C ++。我已经了解了可以内联虚拟函数的罕见情况,例如:Are inline virtual functions really a non-sense? 接受的答案表明只有在运行时知道确切的类时才可以进行内联,例如在处理本地,全局或静态对象(不是指针或对基类型的引用)时。我理解这背后的逻辑,但我想知道在下列情况下是否也可以内联:
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)是这样做的吗?
谢谢!
答案 0 :(得分:2)
第一步称为虚拟化;函数调用不通过虚拟调度的地方。
编译器可以并且确实虚拟化最终类的最终方法和方法。这几乎是决赛的全部要点。
一旦被虚拟化,就可以内联方法。
有些编译器有时可以证明*a
的静态类型,甚至可以虚拟化它。这不太可靠。 Godbolt的编译器浏览器可以帮助您了解可能发生的具体优化以及失败的原因。