inline是C++的一个关键字,用来修饰函数。内联函数是C++中的一种特殊函数,它可以像普通函数一样被调用,但是在调用时并不通过普通函数调用的机制而是通过将函数体直接插入到调用处来实现,内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,可以减少由函数调用带来的开销。(以空间换时间)
inline函数在编译阶段进行处理,会在函数的调用点直接将代码展开(会导致函数只在本文件中可见)。
inline一般适用于以下情况:
①某个代码量不大且不断被重复调用的函数;
②函数只有简单的几行,且函数内部不包含for、while、switch语句。
- inline函数与static修饰的函数的区别:
①调用方式不同,导致时间开销不同:inline函数无清栈开栈的开销,static需要清栈开栈;
②都会使函数本文件可见,但原因不同:inline函数是因为编译阶段在调用点直接展开代码导致函数本文件可见,而static是因为本身是local属性导致函数本文件可见。
- inline函数和宏的区别:(宏是简单的字符替换)
①处理时间不同:inline函数在编译阶段处理,宏在预编译阶段处理;
②inline函数有类型检查和安全性检查,而宏没有,宏只做字符替换。
- inline函数的注意事项:
①inline一般写在.h中,在一个项目中多个文件可以通过引用头文件使用inline函数,否则需要在每一个使用它的源文件中定义;
②inline只在Release版本生效,在debug中和普通函数相同;
③inline只是给编译器的一个建议。一般情况下,内联函数的函数体不能太大,如果内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。编译器可以选择忽略这个建议。递归不能被处理处理成内联函数;
④inline是基于实现,不是基于声明。必须要与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前不起任何作用。如下:
void Foo(int x,int y);
inline void Foo(int x,int y) //与函数的定体放在一起,可以成为内联函数
inline void Foo(int x,int y);//inline仅与函数声明放在一起,不能成为内联函数
void Foo(int x,int y){}
可能有的小伙伴会疑惑,既然内联函数与普通函数相比能提高函数执行效率,为什么不把所有函数都设为内联函数?
内联是以代码膨胀(复制)为代价,只省去了函数调用的开销。如果执行代码的开销相比于调用的开销较大,那么提高的效率很少。另外,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。
是否设为inline函数:
调用开销 > 执行开销,设为inline函数;
调用开销 < 执行开销,不设为inline函数。