内联函数:
以inline修饰的函数叫做内联函数,编译阶段C++编译器会在调用内联函数的地方直接展开,没有函数压栈的开销。“空间换时间”
一、inline一般用于如下情况:
- 一个函数不断地被重复调用(函数体小适宜)
- 函数只有简单几行,且函数不包括for,while,switch语句。
一般来说,小程序没必要定义成inline,但是如果要完成一个工程项目,当一个简单函数被调用多次时,则应该考虑用inline
二、inline的注意事项:
- 一般写头文件中,便于一个项目多个文件的引用。
- 只在Release版本生效
- 给编译器的一个建议,最终决定权在于编译器(递归、循环不展开)
- 是基于实现,不是基于声明
inline void Foo(int x,int y); //inline与函数声明放在一起,不能成为lnline
void Foo(int x,int y){}
void Foo(int x,int y);
inline void Foo(int x,int y) //与函数的定义体放在一起,可以成为内联函数
内联是以代码膨胀(复制)为代价,只省去了函数调用开栈的开销。如果执行代码的开销相比于调用的开销较大,那么提高的效率很少。另外,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。是否设置为inline需要权衡:
调用开销 > 执行开销,设为inline函
调用开销 < 执行开销,不设为inline函数
相关面经:
1.inline函数与static修饰的函数的区别
- inline 无开栈清栈开销,static函数需要清栈开栈。
- inline 因为编译阶段代码展开导致函数本文件可见, static 符号属性为local 本文件可见
2.inline函数和宏的区别
- inline 在编译阶段进行参数 类型检查和安全检查,宏处理在预编译期间,不进行参数 类型检查和安全检查。
- inline是一种更安全的宏