内联函数
- 1.内联函数的概念
- 2.C++为什么要有内联函数?
- 3.内联函数展示
- 3.1查看方式
- 3.2 观察汇编代码
- 4.使用内联函数的注意事项
- 5.内联函数缺点和优点
1.内联函数的概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
2.C++为什么要有内联函数?
在C语言中,宏函数也无需创建函数栈帧,而是在预处理阶段将写好的宏函数进行代码的直接替换。但是这种的直接替换虽然可以提高代码的复用性和性能,也会造成一些缺点。
比如:
1.不方便调试宏。
2.导致代码可读性差,可维护性差,容易误用。
3.没有类型安全的检查。
所以C++为了弥补这些缺点,就开创了内联函数。
3.内联函数展示
要使用内联函数,在函数的名字定义前加上inline即可
#include <iostream>
using namespace std;
inline int ADD(int x, int y)
{
return x + y;
}
int main()
{
int tmp = 0;
tmp = ADD(3, 2);
return 0;
}
3.1查看方式
- 在release模式下,查看编译器生成的汇编代码中是否存在call Add
- 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2019的设置方式)
1.选择调试属性
2.在常规里面选择调试信息格式-程序数据库
3.然后优化->选择内联函数扩展->选择只适用于_inline(/Ob1)
3.2 观察汇编代码
我们先来看看debug下,没有优化后前的汇编代码
这条call指令说明创建了函数栈帧。
我们再来看看优化后的汇编代码
可以看到,使用内联函数优化后,并没有调用函数,而是像宏一样直接展开了。
4.使用内联函数的注意事项
程序员请求将函数作为内联函数时,编译器并不一定会满足要求。它可能认为该函数过大或注意到函数调用了自己(内联函数不能递归),因此不将其作为内联参数;而有些编译器没有启用或实现这些特性。
5.内联函数缺点和优点
通过注意事项我们可以知道,当函数的代码函数过多时,编译器可以会忽略程序员的请求。
这就说明内联函数的缺点是:可能会使目标文件过大
优点就是:
1.少了调用函数的开销,提高程序运行效率。
2.相比于宏,也便于调试。
3.写代码方便,避免了宏的一些易错情况