概念
用inline修饰的函数就叫做内联函数,编译时编译器会在调用内联函数的地方直接将内联函数展开,而不是调用。内联函数的调用没有建立栈帧的开销,有利于效率的提高。
int Add(int a, int b)
{
return a + b;
}
int main()
{
int sum = Add(1, 2);
cout << sum << endl;
return 0;
}
在运行上述代码时,在使用Add函数时我们可以通过反汇编,编译器是对这个函数进行调用,而不是在这里展开,如图
在Add函数前加上inline后,代码如下
inline int Add(int a, int b)
{
return a + b;
}
int main()
{
int sum = Add(1, 2);
cout << sum << endl;
return 0;
}
编译器会直接在调用内联函数的地方直接将内联函数展开,而不是再进行调用。如图
特性
-
inline是一种以空间换时间的做法,如果编译器将函数当做内联函数进行处理,在编译阶段会用函数体替换函数调用。但这可能会使目标文件变大,因为它会在使用的地方直接展开。优点是减少了建立栈帧的开销,提高了效率。
-
inline对于编译器来说仅仅是一个建议,而不是加上inline就是内联函数。加上inline仅仅是向编译器发出了一个申请,编译器可以忽略这一申请。一般来说,内联机制适用于函数规模较小、流程直接、频繁调用的函数。不适用递归函数。
-
inline不建议声明和定义分离,分离容易出现链接错误。声明和定义分离后,vs报错如图