C++内联函数(C++ inline)详解
内联函数的使用有利于代码的重用,可以提高开发效率,增加程序的可靠性,也利于分工合作和修改维护。
函数在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还要将实参复制给形参,最后也要将返回地址入栈(该地址指明了函数结束后,程序应该从哪开始执行),
最后跳转到函数内部执行,这个过程是要浪费时间的。
另外函数在执行return语句时,需要从栈中回收形参和局部变量的存储空间,然后从栈中取出返回地址,跳转到该地址执行,这个过程也是需要时间。
这就是函数调用的基本过程,这个过程与将函数直接在代码中抄一遍,节省了人力,但是也为程序的运行带来的额外的开销。
一般来说,这种开销可以忽略不计的,但是如果函数里面的代码比较少时,执行时间本来就短,现在再给它套上一个函数体,就增加了额外的开销,
所以此时这个开销就不能忽略不计了,再加上如果这个函数被调用千百次,函数调用导致的时间开销可能就会使得程序运行明显变慢。
为特别注重程序执行效率,适合编写底层系统软件的高级程序设计语言,C++ 用 inline 关键字较好地解决了函数调用开销的问题。
在 C++ 中,可以在定义函数时,在返回值类型前面加上 inline 关键字。如:
inline int Max (int a, int b)
{
if(a >b)
return a;
return b;
}
加了 inline 关键字的函数称为“内联函数”。内联函数和普通函数的区别在于:当编译器处理调用内联函数的语句时,不会将该语句编译成函数调用的指令,而是直接将整个函数体的代码插人调用语句处,就像整个函数体在调用处被重写了一遍一样。
有了内联函数,就能像调用一个函数那样方便地重复使用一段代码,而不需要付出执行函数调用的额外开销。很显然,使用内联函数会使最终可执行程序的体积增加。以时间换取空间,或增加空间消耗来节省时间,这是计算机学科中常用的方法。
内联函数中的代码应该只是很简单、执行很快的几条语句。如果一个函数较为复杂,它执行的时间可能上万倍于函数调用的额外开销,那么将其作为内联函数处理的结果是付出让代码体积增加不少的代价,却只使速度提高了万分之一,这显然是不划算的,所以内联函数一般适用于那些经常被调用的函数,并且函数内部语句较简单。
有时函数看上去很简单,例如只有一个包含一两条语句的循环,但该循环的执行次数可能很多,要消耗大量时间,那么这种情况也不适合将其实现为内联函数。
另外,需要注意的是,调用内联函数的语句前必须先在函数体前面声明为inline,定义的时候有无没有影响。