C++ 内联(inline)函数
inline是C++关键字,在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。
在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间的问题,特别的引入了inline修饰符,表示为内联函数。内联函数实质是在调用点将函数展开,从而减少了对堆栈的操作(在堆栈中调用函数较为复杂,直接展开为代码运行效率更高)。
内联函数牺牲了空间但是降低了调用函数时的额外开销,以空间换时间,在大部分情况下时值得的。
内联函数的使用方法
在class之外,多一个inline修饰符。
class A{
private:
/*...*/
public:
/*...*/
int add(int x,int y) {return x+y;}
/*...*/
}
/*
如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上inline,否则就认为不是内联的
*/
inline int A::add(int x,int y){
/*...*/
}
inline int add1(int x,int y){
/*...*/
}
在class之内定义的函数是自动内联的。
class A{
private:
/*...*/
public:
/*...*/
int add(int x,int y) {return x+y;}
/*...*/
}
内联函数的使用规则
-
inline说明对编译器来说只是一种建议,编译器可以选择忽略这个建议。对于过大的函数,编译器会忽略inline。
-
关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用,inline函数实质上是一种声明,最好直接将内联函数定义一起放在.h文件中。
使用inline的时机
代码短小(例如只有2、3行)且多次调用。
若函数较大或有递归调用(Recursive functions)则不使用inline。
inline函数与宏函数的差异
宏
-
宏调用是通过简单文本替换来实现的,不会对参数进行类型检查。
-
宏的使用是预处理器直接对宏代码进行调用,没有参数压栈、生成相应汇编代码、返回参数等时间花费。
-
宏可能会产生意想不到的边缘效应,很容易出错,要非常小心优先级的变动。
内联
-
inline 对编译器来说是一种请求,而不是命令。
-
C++中的内联机制既具备宏代码的效率,又增加了安全性,可以自由操作类的数据成员,而宏代码无法操作类的私有成员。
例如对于下面代码
#include<iostream>
#define add1(x,y) ((x)+(y)) //宏定义
using namespace std;
inline int add2(int x,int y){ //内联
return x+y;
}
int main()
{
double a=1.0,b=2.0;
printf(" %d \n",add1(a,b));
printf(" %d \n",add2(a,b));
return 0 ;
}
得到结果
0//宏没有对类型检测
3//inline进行了强制类型转化
因而建议在c++中用inline函数代替宏函数

浙公网安备 33010602011771号