inline 函数
通过前面几个小结的学习,我们了解到了函数的工作原理。我们知道,函数在工作的以后,C++ 会为函数分配相应的内存,而且还存在参数的拷贝。这些就导致函数在调用的时候会带来额外的内存消耗。
但是函数又是一个可以让程序变得模块清晰的东西。那么有没有什么办法又能让我们使用函数,而又不带来更多的性能消耗呢?
C++ 为我们提供了一种函数形式,叫做内联函数。在程序编译的时候,编译器会把内联函数的代码复制出来,粘贴到调用的地方。例如如下代码:
int add(int a, int b)
{
return a + b;
}
int main(int argc,char **argv)
{
int a = 5;
int b = 10;
int c = add(a + b);
return 0;
}
如果我们把 int add(int a, int b) 函数编程内联函数,那么这段程序在编译的时候,将会被自动处理成这样:
int main(int argc,char **argv)
{
int a = 5;
int b = 10;
int c = a + b;
return 0;
}
可以看到,经过编译器处理,这里就不再有函数的调用了。
那么如何把一个函数变成内联函数呢?只需要在函数前面加 inline 关键字就可以了。
inline int add(int a, int b)
{
return a + b;
}
需要注意的是,内联函数必须在函数定义的时候写上 inline 才可以,也就是说,这样写是不行的:
inline int add(int a, int b);
int add(int a, int b)
{
return a + b;
}
必须这样写:
int add(int a, int b);
inline int add(int a, int b)
{
return a + b;
}
不必过于在意 inline
内联函数有好处,就是可以节省调用时候的额外开销。但是同时也会造成另外的问题,内联是以代码膨胀为代价而进行的优化,而如果一个函数过长,或者一个函数被调用了好多次,那么显然就不是适合使用内联函数优化。
其实现代的编译器,会对代码进行足够的优化,有些时候,你写了内联函数,但是编译器不一定会按照内联去优化,而有的函数,你没有写内联,他却会给你优化成内联。所以大家在初学 C++ 的时候其实没必要太纠结内联函数的实际优化效果。