内联函数是编译器使用的一种优化技术。只需在函数原型前加上 inline 关键字即可将函数声明为内联函数。内联函数会指示编译器将函数的完整主体插入到代码中任何调用该函数的地方。
优点: 1) 无需函数调用开销。
2) 调用函数时,还可以节省栈上变量的压栈/弹栈开销。
3) 还可以节省函数返回的开销。
4) 通过利用指令缓存来提高引用局部性。
5) 内联后,编译器还可以应用过程内优化(intraprocedural optimization),如果指定的话。这是最重要的一点,通过这种方式,编译器可以专注于死代码消除、更侧重于分支预测、归纳变量消除等。
缺点 :-
1) 可能会增加函数大小,导致其无法放入缓存,引起大量缓存未命中。
2) 内联函数后,如果将要使用寄存器的变量数量增加,可能会对寄存器变量资源利用造成开销。
3) 可能会导致编译开销,因为如果有人更改内联函数中的代码,所有调用该函数的位置都将重新编译。
4) 如果在头文件中使用,会使头文件变大,甚至难以阅读。
5) 如果使用过多的内联函数导致代码量增大,可能会在内存中造成颠簸(thrashing)。越来越多的页错误(page fault)会降低程序性能。
6) 对于不希望二进制文件过大的嵌入式系统,由于内存大小的限制,内联函数并不适用。
性能 : -
现在我们来讨论大家最关心的话题——“性能”。
在大多数情况下,内联函数的使用可以提高性能,因为它节省了大量开销,如我们在上面的优点部分所述。但正如我们也讨论了其缺点一样,在使用时需要非常小心。如今的现代编译器会自动对内联函数进行优化,因此在大多数情况下无需显式指定。虽然放置 inline 关键字只是给编译器一个提示,表明该函数可以通过内联进行优化,但最终是否内联由编译器决定。不过,也有一些方法可以指示编译器进行内联,例如在 Microsoft Visual C++ 中,可以使用 __forceinline 来指示编译器内联函数。我建议除非您对性能提升非常有把握,否则不要使用此关键字。使函数内联可能会也可能不会带来性能提升,这完全取决于您的代码流程。不要指望通过在函数前加上 inline 关键字就能带来神奇的性能提升,因为如今大多数编译器都会自动执行此操作。
正如我们所见,内联函数在性能方面有所帮助,但必须非常谨慎地使用。
我准备了一些使用指南。
使用指南 :-
1) 当您确定它能提高性能时,请始终使用内联函数。
2) 始终优先使用内联函数而不是宏。
3) 不要内联代码量大的函数,为了获得性能,应该始终内联代码量小的函数。
4) 如果要在类中内联函数,请优先在类外部定义函数时使用 inline 关键字。
5) 在 C++ 中,默认情况下,在类内声明和定义的成员函数会被内联。因此,在此类情况下无需指定。
6) 如果异常处理模型存在差异,函数将不会被内联。例如,如果调用函数遵循 C++ 结构化处理,而您的内联函数遵循结构化异常处理。
7) 对于递归函数,大多数编译器不会进行内联,但 Microsoft Visual C++ 编译器为此提供了一个特殊的 pragma:pragma inline_recursion(on),您还可以使用 pragma inline_depth 来控制其限制。
8) 如果函数是虚拟函数且以虚拟方式调用,则不会被内联。因此,请注意这种情况,函数指针的使用也同样如此。
有关更多此类信息,请访问我的技术博客:
http://www.tajendrasengar.blogspot.com/2010/03/what-is-inline-function-in-cc.html
以上就是我的全部内容,希望您喜欢阅读这篇帖子。