内联函数的作用主要是用来提高程序执行效率。如果函数是内联的,编译器在编译时,会把内联函数的实现替换到每个调用内联函数的地方,其和宏定义作类似,但宏函数不会进行类型检查。
通常在进行函数调用时,其过程为:
内联函数主要是解决函数的频繁调用,大量内存消耗的问题。
我们可以知道,函数的调用就涉及到入栈出栈等问题,在这个过程中,传递参数、寄存器操作、返回值等会消耗额外的时间和内存,如果调用的函数代码量很少,也许转移到调用函数的时间比函数执行的时间更长。而如果使用内联函数,内联函数会在调用处将代码展开,从而节省了调用函数的开销。
C++ 用 inline 关键字较好地解决了函数调用开销的问题。当程序执行到内联函数时,相当于复制了一份函数代码(内联函数会再调用处将代码展开)。相当于牺牲空间,赢得时间。也就是节省调用函数的开销。
NOTE:内联说明只是向编译器发出一个请求,编译器可以选择忽略这个请求。
在 C++ 中,可以在定义函数时,在返回值类型前面加上 inline 关键字,这函数就是内联函数。如:
inline int sum(int a, int b)
{
return a + b;
}
不适用情况:递归函数、或函数中含有循环结构(浪费时间)、或函数代码过长(消耗内存)
适用情况:内联一般在类中使用(函数内进行简单的赋值、或直接返回数据、或1~5条小语句)
内联函数定义建议放在头文件中,但是不强制要求
那为什么不能把所有的函数写成内联函数?
因为内联函数以代码复杂为代价,它以省去函数调用的开销来提高执行效率。所以一方面如果内联函数体内代码执行时间相比函数调用开销较大,则没有太大的意义;另一方面每一处内联函数的调用都要复制代码,消耗更多的内存空间,因此以下情况不宜使用内联函数:
函数体内的代码比较长,将导致内存消耗代价
函数体内有循环,函数执行时间要比函数调用开销大