内联函数
内联函数指的是用[ inline ]关键字修饰的函数,在类体内定义的函数会被默认定义为内联函数
特性
内联函数会在【编译】期间进行替换,就是将调用该函数的地方换成【函数体】(类似于C语言中的宏,然而宏是在【预处理】阶段进行替换)
内联函数和宏的不同之处
1、类型检测
我们先定义一个MAX宏
#include<stdio.h>
#include<stdlib.h>
#define MAX(a,b) (a>b)?a:b
int main()
{
int a = 10;
int b = 20;
int ret = MAX(a,b);
printf("ret = %d\n",ret);
system("pause");
return 0;
}
上面便定义了一个MAX的宏,可以求a和b的大小
然而,利用宏是有问题
#define MAX(a,b) (a>b)?a:b
int main()
{
int a = 10;
int b = 20;
int ret = MAX(a++,b);
printf("ret = %d\n",ret);
system("pause");
return 0;
}
如果用MAX(a++,b)
则这个是含有副作用的
#define MAX(a,b) (a>b)?a:b
int main()
{
int a = 10;
int b = 20;
int ret = MAX(a++,b);//利用宏,a的值会被修改
printf("ret = %d\n",ret);
system("pause");
return 0;
}
上例便说明了宏传入含有
【副作用参数】便会有影响
内联函数便很好的解决了这个问题
内联函数是毕竟是【函数】,有【参数类型】的判断。
2、替换时机不同
内联函数在【编译】的时候替换
宏在【预处理】阶段进行替换
3、替换的成功率
宏一旦定义则在【预处理】阶段一定会替换
内联函数仅仅是对【编译器】的一个建议
如果编译器觉得该函数不适合成为内联函数时,便会忽略前面的[ inline ]关键字
比如当我们将一个【递归】函数,如果编译器不进行检测,那么文件就会无限的扩大下去
此时,【编译器】便会忽略[ inline ]关键字
总结
总的来说,【内联函数】是消除【函数调用】时的开销。
和宏类似,一个小的函数声明成【内联函数】可以非常受益。
并且避免了宏传【副作用参数】的所造成的错误。
不管自己定义内联函数与否,【编译器】会根据自己的判断来决定是否内联