一、什么叫inline函数?
当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度。(函数的调用过程,由于有前面所说的参数入栈等操作,所以总要多占用一些时间)。这样做的不好处:由于每当代码调用到内联函数,就需要在调用处直接插入一段该函数的代码,所以程序的体积将增大。
二、inline 函数的声明或定义
inline int max(int a, int b)
{
return (a>b)? a : b;
}
内联函数的本质是,节省时间但是消耗空间。
三、inline函数的规则
(1)、一个函数可以自已调用自已,称为递归调用(后面讲到),含有递归调用的函数不能设置为inline;
(2)、使用了复杂流程控制语句:循环语句和switch语句,无法设置为inline;
(3)、由于inline增加体积的特性,所以建议inline函数内的代码应很短小。最好不超过5行。
(4)、inline仅做为一种“请求”,特定的情况下,编译器将不理会inline关键字,而强制让函数成为普通函数。出现这种情况,编译器会给出警告消息。
(5)、在你调用一个内联函数之前,这个函数一定要在之前有声明或已定义为inline,如果在前面声明为普通函数,而在调用代码后面才定义为一个inline函数,程序可以通过编译,但该函数没有实现inline。比如下面代码片段:
//函数一开始没有被声明为inline:
void foo();
//然后就有代码调用它:
foo();
//在调用后才有定义函数为inline:
inline void foo()
{
. .....
}
代码是foo()函数最终没有实现inline;
(6)为了调试方便,在程序处于调试阶段时,所有内联函数都不被实现。
四、定义在类声明之中的成员函数将自动地成为内联函数
// 头文件
class A
{
public:
void Foo(int x, int y);
}
// 定义文件
inline void A::Foo(int x, int y){}
五、谨慎使用内联函数
1)内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。
2)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
3)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
六、内联函数的叙述正确
1)内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销;
2)如果内联函数体内的代码比较长,使用内联将导致内存消耗代价较高;
3)如果内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了;
4)在类中声明同时定义的成员函数,一般自动转化为内联函数;
5)内联函数中一般不能有复杂操作,比如:循环或递归调用