内联函数inline

一、什么叫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)内联函数中一般不能有复杂操作,比如:循环或递归调用




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值