本文转载自微信公众号《猎杀Linux》,作者HunTalk_Linux。转载本文请联系魂锁Linux公众号。内联函数是C语言从C++中借用的,正确使用内联函数可以提高程序的执行效率。本文将讲解内联函数,一起来看看吧!1、函数调用在讲内联函数之前,我们先要了解函数调用,而函数调用就不得不说到函数调用的开销。执行一个函数时,通常会调用另一个函数。比如在执行函数A时,我们需要处理一些数据,将运算结果暂存在R0寄存器中,然后再调用另一个函数B,而函数B也使用R0这个寄存器(用来保存函数的返回值)function),改变了原来由函数A保存在R0寄存器中的值,这肯定是不可能的。现代计算机系统的做法是,在执行函数B之前先将R0寄存器的值保存到栈中,函数B执行完毕后,将栈中的值恢复到R0寄存器中,然后函数A继续执行。数据处理不会有问题。但是,函数调用需要一定的时间来切换。这个时间用来保存场景和恢复场景,大致相当于一两条语句的执行时间。这是函数调用带来的开销。如果B函数很小,只有一两行代码,从上图我们可以看出,只有B函数执行代码的时间对我们有用,switch会带来额外的开销开销。如果在里面多次调用functionAFunctionB,开销就比较明显了。2、内联函数B函数很小,调用频率很高。可能函数调用的切换时间比函数中代码的执行时间要长。这显然是不划算的,所以我们可以把这个函数声明为inline(加上inline),编译器在编译的时候,会把inline函数的实现替换到每一个调用inline函数的地方(可以类比成宏function),并在调用处展开代码,相当于自动将functionB的代码在调用处复制一份,来不及保护现场和恢复现场,从而节省了函数调用的开销。内联函数的一般要求如下:1、函数体积小,一般在5行以内;2.被频繁调用;3、函数中没有复杂的实现,如:while、for循环、switch、递归等;4.函数不包含静态变量。让我们看一个简单的内联函数的例子:#include//Declarethefunctionmax_valueasinlineinlineintmax_value(intx,inty){return(x>y)?x:y;}intmain(){inta=1,b=2;诠释米;m=max_value(a,b);return0;}当main函数代码执行时,看起来像这样:intmain(){inta=1,b=2;诠释米;米=(1>2)?1:2;return0;}内联函数在调用点展开。c++中类中定义的函数默认都是内联的,比如下面这种情况:#includeusingnamespacestd;classHunTalk_Linux{public://默认为内联函数intmax_value(intx,inty){return(x>y)?x:y;}};intmain(){return0;}注意:声明为内联的函数只是对编译器的建议。如果函数比较复杂,编译器会把它当作普通函数。3.内联函数和宏前面说到可以类比宏函数,所以我想为什么不直接定义一个宏,而是定义一个内联函数呢?存在就是合理的,存在就是有理由的。与宏相比,内联函数提供了一个更好的方法:参数类型检查。在编译过程中,宏调用不进行类型检查,甚至连正常的参数也不检查。内联函数虽然具有宏展开的特性,但本质上仍然是函数,编译器仍然可以对其进行参数检查,而宏则没有这个功能。宏中的编译错误很难发现,因为它们指的是扩展代码而不是程序员键入的内容。易于调试。内联函数代码的调试信息通常比展开的宏代码更有用,还可以支持断点、单步等调试功能。接口封装。一些内联函数可以用来封装一个接口,但是宏没有这个特性。4.总结内联函数的引入主要是为了解决一些频繁调用的小函数带来的额外时间开销的问题,但也应该在满足某些内联函数的情况下使用。使用大量的内联函数,每一个调用函数的地方都需要用函数体替换,代码量会增加,代码量会增加,也会带来潜在的编译时间增加。算法中有一个概念叫空间换时间,就是用内存占用更大的算法来换取执行速度的提升,所以正确使用内联函数可以提高程序的执行效率。本文转载自微信公众号“混讲Linux”,可通过以下二维码关注。转载本文请联系魂锁Linux公众号。