C++中的inline function(内联函数)
2019-12-11 本文已影响0人
fck_13
(1)inline
有什么用?
通常我们调用函数的时候,一般的流程为函数入栈,传入参数(如果有的话),出栈,再把返回值(如果有的话)给调用函数。
将函数声明成inline
后,当执行到该函数的时候,该函数会再执行点展开,你可以把这个过程想象成宏展开。这样就可以避免出栈入栈和传递参数返回值的操作。这是一种编译器的优化。
(2)什么情况下函数可能是inline
的?
- 声明带有
inline
指示符的函数 - 类的成员函数,如果其定义写在类内,即使没有加
inline
指示符,也是inline函数 -
constexpr
函数被隐士的声明为inline函数 - 所有函数,尤其是短函数,都有可能是
inline
函数(原因见(3)) - 定义的非成员友元函数是
inline
的,即下面的friend_set
class X {
int a;
friend void friend_set(X& p, int i) {
p.a = i; // this is a non-member function
}
public:
void member_set(int i) {
a = i; // this is a member function
}
};
(3)编译器如果对待inline
函数?
说到底,inline
是编译器的一种优化策略,所以inline
对编译器来说只是一种建议,编译器可以接受,也可以不接受。所以即便你对一个函数加了inline
,编译器也可以把它当成普通函数。
如果一个函数没有被声明为inline
,而编译器觉得它可以inline
,也会把它搞成inline
函数。
(4)什么情况下不能将函数声明为inline
?
- virtual function(虚函数)。如果只用对象来调用虚函数,这时候虚函数是可以被
inline
的。因为此时编译器很明确的知道object的类型,该类也已经被实例化了。如果用引用或者指针来调用虚函数,那么这只能在运行时才能决定是什么类型,而inline
是在编译期决定的。 - 在块作用域内的函数不能被声明为
inline
。
(5)inline
有什么缺点?
- 会使可执行文件变得比较大
- 很难debug
inline
的函数