一、概念
以inline修饰的函数叫做内联函数,编译时c++编译器会在调用函数的地方展开,而不会建立栈帧,提升了程序运行的效率
例子:
#include <iostream>
using namespace std;
int Add(int left, int right)
{
return left - right;
}
int main()
{
int ret = 0;
ret = Add(1, 2);
return 0;
}
查看反汇编代码,发现一个call指令
如果在上述函数前增加inline关键字将其改成内联函数,在编译器期间编译器会将函数体替换函数的调用
两个注意点:
1.在debug环境下,默认不会对编译器优化,所以要查看inline函数得先开启设置,不然的话,即使加了inline,还是看不到inline函数展开的过程
2.release环境下,不管什么,对编译器进行了很强大的优化
debug环境:
右击该解决方案,选择属性,选择以下内容
设置好后,再查看反汇编,此时没有了call指令
release环境:
在release版本下,发现优化的更加厉害,前面的啥指令都不调用了, 也不开空间了。
二、特性
1.inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,则在编译阶段函数体会替换函数调用,优点:少了调用开销,提高程序运行效率,缺点:可能使目标文件变大
2.inline只是给编译器提供一个展开建议,至于实不实现展开看编译器,一般来说:函数规模较小、不是递归、不是频繁调用的inline函数编译器会展开函数体,否则会忽略其特性。
3.inline不建议声明和定义分离,分离会导致链接错误。因为inline函数被展开,就没有了函数地址,就没有了call指令,那么在链接时就会找不到定义 。look
//fun.h
#include <iostream>
using namespace std;
inline void fun(int i);
//fun.cpp
#include "fun.h"
void f(int i)
{
cout << i << endl;
}
//test.cpp
#include "fun.h"
int Add(int left, int right)
{
return left - right;
}
int main()
{
int ret = 0;
ret = Add(1, 2);
return 0;
}
编译结果: