欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

inline 内联函数

shiping1 的头像
13.4 inline 函数

从某种角度上讲,inline对程序影响几乎可以当成是一种编译选项(事实上它也可以由编译选项实现)。

13.4.1 什么叫inline函数?

inline(小心,不是online),翻译成“内联”或“内嵌”。意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。

这样做的好处是省去了调用的过程,加快程序运行速度。(函数的调用过程,由于有前面所说的参数入栈等操作,所以总要多占用一些时间)。

这样做的不好处:由于每当代码调用到内联函数,就需要在调用处直接插入一段该函数的代码,所以程序的体积将增大。

拿生活现象比喻,就像电视坏了,通过电话找修理工来,你会嫌慢,于是干脆在家里养了一个修理工。这样当然是快了,不过,修理工住在你家可就要占地儿了。

(某勤奋好学之大款看到这段教程,沉思片刻,转头对床上的“二奶”说:

“终于明白你和街上‘鸡’的区别了”。

“什么区别?”

“你是内联型。”)

 

内联函数并不是必须的,它只是为了提高速度而进行的一种修饰。要修饰一个函数为内联型,使用如下格式:

 

inline 函数的声明或定义

 

简单一句话,在函数声明或定义前加一个 inline 修饰符。

 

inline int max(int a, int b)

{

   return (a>b)? a : b;

}

 

13.4.2 inline函数的规则

规则一、一个函数可以自己调用自己,称为递归调用(后面讲到),含有递归调用的函数不能设置为inline;

规则二、使用了复杂流程控制语句:循环语句和switch语句,无法设置为inline;

规则三、由于inline增加体积的特性,所以建议inline函数内的代码应很短小。最好不超过5行。

规则四、inline仅做为一种“请求”,特定的情况下,编译器将不理会inline关键字,而强制让函数成为普通函数。出现这种情况,编译器会给出警告消息。

规则五、在你调用一个内联函数之前,这个函数一定要在之前有声明或已定义为inline,如果在前面声明为普通函数,而在调用代码后面才定义为一个inline函数,程序可以通过编译,但该函数没有实现inline。

比如下面代码片段:

 

//函数一开始没有被声明为inline:

void foo();

 

//然后就有代码调用它:

foo();

 

//在调用后才有定义函数为inline:

inline void foo()

{

   ......

}

 

代码是的foo()函数最终没有实现inline;

 

规则六、为了调试方便,在程序处于调试阶段时,所有内联函数都不被实现。

 

最后是笔者的一点“建议”:如果你真的发觉你的程序跑得很慢了,99.9%的原因在于你不合理甚至是错误的设计,而和你用不用inline无关。所以,其实,inline根本不是本章的重点。

 

所以,有关inline 还会带来的一些其它困扰,我决定先不说了。

来自 http://hi.baidu.com/gzobphuhamacfre/item/ef2cd583a633f2874514cf03

普通分类: