目录
一.什么是内联函数
二.内联函数和宏的区别
三.内联函数和static修饰的函数的区别
四.使用inline的时机
五.内敛函数的缺点
六.使用内联函数时需要注意的事项
一.什么是内联函数
例如现在有如下一个函数
int sum(int x,int y)
{
return x+y;
}
虽然这个函数只有短短的三行,但当调用它时,会进行参数压栈,函数栈帧的开辟和回退过程,这会给系统带来很大的开销。因此我们可以使用内联函数。
inline int sum(int x,int y)
{
return x+y;
}
所谓的内联函数指的是,在函数的调用点直接把函数的代码展开,并且这一过程中没有其他符号产生,从而提升了整个程序的运行效率。而这一过程是在编译间段进行的。
还需特别注意的是,不是所有被inline修饰的函数都会被编译器当做内联函数来处理,例如递归。
二.内联函数和宏的区别
1.内联函数
- 处理时机:编译间段。
- 作用:进行代码展开,有安全检查和类型检查,可以理解为一种更安全的宏。
2.宏
- 处理时机:预编译间段。
- 作用:文本替换,没有安全检查和类型检查。
三.内联函数和static修饰的函数的区别
1.内联函数
- 没有开栈和清栈的开销
- 直接在调用点把代码展开
2. static修饰的函数
- 有开栈和清栈的开销
- 把属性设为local
四.使用inline的时机
- 开栈清栈的开销 > 执行的开销 ---> 函数体较小,建议写为inline函数
- 开栈清栈的开销 < 执行的开销 ---> 函数体较大,不建议写为inline函数
五.内敛函数的缺点
六.使用内联函数时需要注意的事项
1.内联函数只是给编译器的一个建议,即最终是否将某个函数当为内联函数来处理是由编译器来决定的。
2.内敛函数只能写在头文件中。
内联函数发生上面那种替换是在编译期间,在编译期间编译器为了找到需要找到内联函数的定义,所以在为了方便编译器找到定义,每个文件引用头文件后,都直接拥有这种定义,而不用再去写。而普通函数可以申明和定义分离,主要是编译阶段就不需要函数定义。首先编译阶段找到函数的申明,链接阶段才会去找函数的定义,将之关联起来。
inline函数的特征是在调用的地方插入相应函数的代码,所以编译之后的目标文件里是没有inline函数体的,因为在要调用的地方它都已经用相应的语句替换掉了(当然这只限于内联成功的情况)。
如果我们将inline函数写在cpp文件里,但是绝大多数情况下,在我们用第三方类库的时候,我们只有头文件和目标文件(没有cpp文件),当你调用那个内联函数时,编译器没办法找到它。所以说将inline函数写在cpp文件中是没什么用的。
3.内联函数只在本文件中可见。