以inline修饰的函数叫做内联函数,编译时 C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数是提升程序运行的效率。
如有一个相加两数的函数:
int ADD(int a,int b){
return a+b;
}
如果在上述函数前面添加inline关键字将其改成内联函数,在编译期间会替换调用函数体的函数的调用位置。这类似于C语言中的宏的替换:
#include<iostream>
using namespace std;
#define ADD(x,y) ((x)+(y))
#define ADD1(x,y) ((x)+(y));
int main() {
cout << ADD(23, 87);
//上述代码中的ADD替换成 宏中的内容
//cout<<((23)+(87));
//宏后面不能加;是因为宏是完全替换的操作如下就会出错
cout << ADD1(23, 24) << endl;
//因为其替换之后代码为:
//cout<<((23)+(24));<<endl; 所以一般不建议在宏后加;
}
宏优点:直接替换调用位置的代码,不用建立函数栈帧,提高效率
宏的缺点:
容易出错,语法细节要求多
而且宏不能调试(在预处理阶段就替换了)
还没有类型的检查(如我传一个int和char会导致结果不理想)
C++中就用:enum const inline来替代宏
enum和const是宏常量
inline是宏函数
而inline却跟正常函数一样,可以调式,有类型检查
使用inline函数的代码如下:
inline int ADD(int a,int b)
{
int c=x+y;
return c;
}
int main(){
int ret1=ADD(23,2);
//不用建立函数栈帧
return 0;
}
从上可以看到其语法跟普通函数没有不同只是在函数前面加上了inline。
在release模式下,可以查看编译器生成的汇编代码中是否存在call Add ,而在debug模式下,需要对编译器进行设置,否则不会展开(替换)。
特性:
由上可知inline是一种以空间换时间的做法,如函数被编译器当做内联函数则会在编译阶段,会用函数体替换函数调用,这可能会导致文件变大,但是少了调用开销可以提高程序运行效率。
inline对于编译器来说只是建议,在不同的编译器中inline的实现也有所不同。
inline修饰:函数不是很大(取决于对应的编译器),不是递归,也不频繁调用的函数可以使用inline修饰,不然编译器会忽略inline的特性。
使用inline时并不建议将声明和定义分开,因为这样会导致链接错误,因为inline被展开,然后就没有了函数地址,链接就会找不到。