为什么这个虚拟方法不能内联?

Why can't this virtual method be inlined?

本文关键字:不能 方法 虚拟 为什么      更新时间:2023-10-16

我读到,用简化的术语来说,如果C++编译器可以证明变量是某种类型的,它就可以内联虚函数。为什么在这种情况下它不能做到这一点(使用 MSVC 2017、clang 4.0、gcc 7.2 和 icc 17 进行测试(:

#include <iostream>
class Callable {
public:
virtual int sq(int n) const;
};
class Square : public Callable {
public:
inline int sq(int n) const override final  {
return n*n;
}
};
class Call {
public:    
const Callable caller;
};
class Methods {
public:
constexpr static const Call c {Square()};
};
int main() {
using std::cout;
cout << Methods().c.caller.sq(5);
}

我注意到 clang 在 godbolt 中的优化输出(下面的链接(说Callable::sq不会被内联,因为它的定义不可用。但是,Methods::cstaticconst.Call::caller也是const.此外,Square::sqfinal.据我所知,它们不可能在运行时更改。还是我错过了什么?

另一方面,编译器能够在此版本中内联函数:

#include <iostream>
class Callable {
public:
virtual int sq(int n) const;
};
class Square : public Callable {
public:
inline int sq(int n) const override final  {
return n*n;
}
};
class Call {
public:    
Callable const* caller;
};
class Methods {
public:
Call c {new Square()};
};
int main() {
using std::cout;    
cout << Methods().c.caller->sq(5);
}

为什么会这样?链接用于干螺栓,便于检查。

尝试在虚函数声明的末尾添加 {}。

virtual int sq(int n) const {}