内联函数的由来
我们在C语言中,经常使用宏函数,例如:
宏函数的特点是对宏直接进行替换,无需调用函数从而提高函数效率,但是,宏函数在C语言中经常会面临非常多的缺点
- 易写错,例如以上括号少一个都会出现问题
- 可读性差,比如更复杂的函数便无法进行宏替换
面对这些问题,在C++中出现了内联函数这一概念。内联函数的功能和宏函数相同,其在预处理时会在调用内敛函数的地方进行展开,没有调用函数而建立的栈帧,从而提高函数运行的效率
内联函数
内联函数的使用
我们在定义内敛函数时,只需要在函数前加上关键字inline,便定义了一个内联函数
此时,我们在调用内联函数时便会直接进行替换
未使用内联函数时,编译器会先调用函数地址(即为call),再调用函数返回值
使用内联函数时,编译器会直接替换掉内联函数的内容,从而大大提高了效率
内联函数的注意
1.内联函数会导致内存膨胀
我们通过内联函数的替换特性,我们可以想象,假设一个内敛函数有8行,我们在程序中使用了一千次这一内联函数,相比于不使用内联函数的1008行,我们使用内联函数便使程序扩大了近7000行。而在程序中,这个数字只会越来越大,所以内联函数会导致程序的内存变大甚至膨胀。
2.内敛函数仅仅是对编译器的建议
通过内联函数产生膨胀,编译器会慎用内敛函数,所以我们就算定义了内联函数,程序仍会对该函数进行分析,如果该函数产生的内存过大,编译器会无视内存函数的定义,仍采取传统的调用函数
同时,递归函数编译器默认不使用内联展开
3.inline不建议声明和定义分离
inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。