内联函数
内联函数是一种特殊类型的函数,内联函数在定义或声明时前面加上“inline”关键字。比如:
inline int max(int a,int b)
{
return (a>b)?a:b;
}
内联(inline)是内联扩展(inline expansion)的简称。 C++编译器处理内联函数比较特殊:在遇到调用内联函数的地方会用函数体中的代码来替换函数的调用。比如下面的函数调用语句:
Int maximum=max(val1,val2);
在编译时会用函数max()的函数体展开:
Int maximum=((val1>val2)?val1:val2);
也就是说,程序执行时并没有真正调用函数max(),而是将内联函数的函数体中的语句直接在函数调用的地方展开了。
内联函数的作用:
引用内联函数的主要目的是即可以保证程序的可读性,又能提高程序的运行效率。函数的引入使得程序的结构比较清晰,可读性好,比如语句:
Int maximum = max(val1,val2);
就比下面的语句可读性好,容易理解:
Int maximum = ((val1>val2)?val1:val2);
而且,程序中可能很多地方都需要用到求两个数的最大值得操作,如果每次都写
(val1>val2)>val1:val2
显得非常麻烦,而用max(val1,val2)就显得简单、清楚得多。
但是,如果将求两个数的最大值这样逻辑非常简单的操作设计为一个一般的函数,系统执行函数调用需要进行栈空间的分配、状态入栈、参数传递等操作,函数的返回需要传递返回值、从栈中弹出信息、释放栈空间等操作,效率会比不使用函数低的多。想max()函数这样功能比较简单的函数,让系统为函数调用做那么多操作不值得,因此C++设计了内联函数,内联函数即可以获得函数的好处,又能提高程序运行效率。
内联函数的使用限制:
并不是所有的函数都能够设计为内联函数。C++对内联函数有很多限制:
1)在内联函数中不能定义任何静态变量;
2)内联函数中不能有复杂的流程控制语句,如循环、switch和goto语句;
3)内联函数不能是递归的;
4)内联函数中不能说明数组。
如果自己定义的函数比较复杂,违反了上面的定义,系统将忽略inline关键字,而视为一般的函数来处理。
所以,内联函数一般是比较小的、经常被调用的、大多可在几行写完的函数。如果函数比较复杂,函数调用和返回的开销相对来说就微不足道,没有必要用内联函数实现。