#include <iostream> using namespace std; class A { virtual void func() { cout << "zz\n"; } virtual void prin(); }; inline void A::prin() { cout << "h"; } int main() { return 0; }
为什么inline可以修饰virtual函数呢?虚函数调用不是要在运行时才能确定吗?而inline不是要在编译时就展开吗?
inline
virtual
小伙看你根骨奇佳,潜力无限,来学PHP伐。
作用非常有限,编译器通常会无视inline修饰,当然也有例外:inline virtual只有当对象类型在编译时被确定时才会起作用,也就是调用这个inline virtual的caller不能是引用或者指针,可以是局部变量,static变量,全局变量。这个时候编译器可能会把这个virtual function优化成普通成员函数inline掉,但是否这么做取决权在编译器,不能得到保证。
inline virtual
理论上说这两者应该是不共存的。但与virtual不同,inline只是编译器的优化建议,编译器并不一定会采纳inline这个建议,所以这两者书写上并存还是允许的,不过在实际编译时,inline就不会展开了。另外我看到过一些信息,说virtual函数也有可能在编译时被确定,从而可以实现inline。不过这都是Compiler Dependent,所以也不能绝对的去说。
建议
inline不是编译时展开,是链接时展开。宏才是预处理时展开。
我的建议是大多数情况下直接忽视inline这个关键字,因为大多数C++编译器都是智能的处理函数内联,几百行的成员函数都可以直接内联,而且如上所说inline只是建议编译器,并不起绝对的作用。
作用非常有限,编译器通常会无视inline修饰,当然也有例外:
inline virtual
只有当对象类型在编译时被确定时才会起作用,也就是调用这个inline virtual
的caller不能是引用或者指针,可以是局部变量,static变量,全局变量。这个时候编译器可能会把这个virtual function优化成普通成员函数inline掉,但是否这么做取决权在编译器,不能得到保证。理论上说这两者应该是不共存的。但与
virtual
不同,inline
只是编译器的优化建议,编译器并不一定会采纳inline
这个建议
,所以这两者书写上并存还是允许的,不过在实际编译时,inline
就不会展开了。另外我看到过一些信息,说
virtual
函数也有可能在编译时被确定,从而可以实现inline
。不过这都是Compiler Dependent,所以也不能绝对的去说。inline不是编译时展开,是链接时展开。宏才是预处理时展开。
我的建议是大多数情况下直接忽视
inline
这个关键字,因为大多数C++编译器都是智能的处理函数内联,几百行的成员函数都可以直接内联,而且如上所说inline
只是建议编译器,并不起绝对的作用。