在函数声明或定义时,将inline关键字加在函数返回类型前面的就是内联函数。
例1:
1 #include<iostream> 2 using namespace std; 3 inline int max(int a,int b){ 4 return a>b?a:b; 5 } 6 int main() 7 { 8 int x1=max(3,4); 9 int x2=max(7,2); 10 int x3=max(x1,x2); 11 cout<<x1<<' '<<x2<<' '<<x3<<endl; 12 return 0; 13 }
内联函数的声明,定义和调用方法与普通函数相同,但C++对它们的处理方式不一样。
如果一个函数被定义为内联函数,在编译时,C++将用内联函数的代码替换对它的每次调用。上面的main函数多次调用的函数max(),C++在编译时会将main函数中的函数调用替换成如下形式:
例2:
1 #include<iostream> 2 using namespace std; 3 inline int max(int a,int b){ 4 return a>b?a:b; 5 } 6 int main() 7 { 8 int x1=3>4?3:4; 9 int x2=7>2?7:2; 10 int x3=x1>x2?x1:x2; 11 cout<<x1<<' '<<x2<<' '<<x3<<endl; 12 return 0; 13 }
内联函数不需要建立函数调用时的运行环境,不需要进行参数传递,也不需要执行指令在主程序和函数指令之间进行转移,所以内联函数执行时间更快。当然,由于每次在调用内联函数时,都会插入它的函数代码,所以它会是程序代码增加,占用更多的内存空间。
说明:
1.内联函数的声明或定义必须在函数的调用之前完成。
例3:
1 inline int min(int a,int b);//声明min是内联函数 2 void main(){ 3 int x=min(23,78); 4 } 5 int min(int a,int b)//可以再本行的最左端加上inline,这里虽省略了,但意义相同 6 { 7 return a<b?a:b; 8 }
在本例中,min函数并未冠以inline关键字(main函数后面的min()是定义),但它仍是内联函数。但下面的例子中的min()就不是内联函数,在函数定义中的内联函数无效。
例4:
1 inline int min(int a,int b);//声明min是普通函数 2 void main(){ 3 int x=min(23,78); 4 } 5 int min(int a,int b)//尽管有inline关键字,但min是个普通函数 6 { 7 return a<b?a:b; 8 }
虽然在最后的函数min()定义时指定它为内联函数,但在main中调用min()时,编译器只能够根据声明确定min()是个普通函数。
2.一般而言只有几行代码的(最好只有1——5行),经常被调用的简单函数才适宜作为内联函数。以下3种函数不能作为内联函数:递归函数,函数体内含有循环,switch,goto语句之类的复杂结构的函数,具有较多代码的大函数。