内联函数
概念
以inline关键字修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升了程序运行的效率。
通过上述图片,我们看出在运行上述代码时,调用Add函数是有建立栈帧的开销的。当我们用inline修饰函数后,可以观察到如下图所示:
通过对上面两张图片的对比,我们可以看出加上inline后,没有了函数栈帧的开销,它会直接在调用内联函数的地方展开运行。
特性
- inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,直接在调用内联函数的地方展开,这样做虽然减少了调用的开销,提高了程序运行效率,但可能会使目标文件变大。
- inline对于编译器来说只是一个建议,意思是你采用了inline关键字,但编译器实不实现是编译器决定的,你只是给编译器发出了一个请求。不同的编译器对于inline的实现机制可能不同,一般建议:函数体的规模较小、不是递归、且频繁调用的函数用inline修饰。
- inline不建议声明和定义分离,分离会导致链接错误。因为inline没有栈帧的开销,就没有函数地址,只会找到声明,但找不到定义。因此inline最好是声明和链接在一起。
当我们运行上述代码时,我们可以看出,尽管我们用inline修饰了函数,但是由于函数规模较大,编译器仍然数建立了栈帧,没有形成内联。