内联函数 inline
有时候需要频繁调用一些函数,而编译器在调用函数的时候会消耗栈空间。为了解决这种问题,我们可以使用关键字 inline
举个栗子
这是我们熟悉的函数
int sum(const int &a,const int &b) { return a + b; } int main(int argc, char const *argv[]) { int a(5); int b(7); std::cout<<sum(a,b)<<std::endl; return 0; }
这种相加的函数我们很有可能随时都要用到,可能在一个程序中要调用几十次
所以可以在函数定义上加一个inline
inline int sum(const int &a,const int &b) { return a + b; } int main(int argc, char const *argv[]) { int a(5); int b(7); std::cout<<sum(a,b)<<std::endl; return 0; }
inline告诉编译器,这个函数在调用的时候,可以直接复制代码给调用的函数,这样更节省栈空间
至于编译器会不会真的这样做,那我们就无法控制了,inline只是一个建议。
inline要放在定义里面。
如果只有声明里有inline 定义里没有,那么这个inline不起作用
比如下面这个例子,是无效的。
inline int sum(const int &a,const int &b); int sum(const int &a,const int &b) { return a + b; }
什么情况下使用inline:
函数很简单,并且需要多次调用
什么情况不能使用inline:
(1) 如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2) 如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
(3) 类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如“偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。