【C++】内联函数inline
文章目录
- 概念
- 使用
- 特性
- 原理
概念
C++中内联函数的出现解决了C语言宏函数的不足,类似于宏展开,这种在函数调用处直接嵌入函数体的函数称为内联函数,又称内嵌函数或内置函数。
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数可以提升程序运行的效率。
使用
在函数的返回值前加上inline关键字即可。
#include<iostream>
using namespace std;
inline int Add(int x, int y)
{
return x + y;
}
int main()
{
int ret = Add(10,20);
cout<<ret<<endl;
return 0;
}
如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。
特性
1)短小的,频繁调用的函数才适合声明为内联函数。要知道inline对于编译器而言只是一个建议,不是强制性的,编译器有自己的判断能力。
2)为什么函数体长了之后,内联函数不展开?
如果函数体代码比较长,如递归等,使用内联函数会导致代码膨胀。会导致编译后的程序存在多份相同的拷贝,编译出来的可执行程序也会非常大,会消耗更多的内存空间,如果指向函数体代码的时间比函数调用的开销大的多,那么inline效率收益会很小。
3)所以inline是一种空间换时间的做法(空间:由于函数体代码展开,编译出来的可执行程序大小/静态库,动态库/会变大)
4)综上,内联函数的缺点:可能会使目标文件变大;优点:少了调用开销,提高程序运行效率。
5)inline内联函数不建议声明和定义分离。
错误定义:声明和定义分离如下:
解决方法:直接在头文件中定义内联函数
原理
我们通过查看程序代码的反汇编语言,来了解一下inline函数的执行原理:
查看方式:
- 在release模式下,查看编译器生成的汇编代码中是否存在call Add
- 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2013的设置方式)
先右击项目,点击项目属性。
我们先来看一段普通函数f的调用过程(通过查看debug下的汇编代码):
内联函数的原理即底层调用方式: