慢慢学Linux驱动开发,第十章,GNU C的扩展
內(nèi)核開發(fā)者使用的C語(yǔ)言涵蓋了ISO C99標(biāo)準(zhǔn)和GNU C擴(kuò)展特性。這里簡(jiǎn)單介紹一下GNU C的擴(kuò)展特性。
1.內(nèi)聯(lián)(inline)函數(shù)
GNU的C編譯器支持內(nèi)聯(lián)函數(shù),也是C++的一個(gè)特性之一。就是函數(shù)會(huì)在所調(diào)用的位置上展開,這樣做雖然會(huì)導(dǎo)致代碼量的增加,會(huì)占用更多的內(nèi)存空間或者占用更多的指令緩存,但是確可以消除函數(shù)調(diào)用和返回所帶來(lái)的開銷,對(duì)于那些代碼量少又需要經(jīng)常調(diào)用的函數(shù)來(lái)說(shuō)還是必須的。所以很顯然對(duì)于一個(gè)很長(zhǎng)的程序是不建議定義為內(nèi)聯(lián)函數(shù)的。
定義一個(gè)內(nèi)聯(lián)函數(shù)的時(shí)候,需要使用static作為關(guān)鍵字,并且用inline限定它:
static inline void Set_Bit(UINT8 res);
內(nèi)聯(lián)函數(shù)必須在使用之前就定義好,否則編譯器就沒(méi)法把這個(gè)函數(shù)展開。實(shí)踐中一般在頭文件中定義內(nèi)聯(lián)函數(shù)。由于使用了static作為關(guān)鍵字進(jìn)行限制,所以編譯時(shí)不會(huì)為內(nèi)聯(lián)函數(shù)單獨(dú)建立一個(gè)函數(shù)體。
因?yàn)楹甓x不具有類型檢查的優(yōu)點(diǎn),所以建議優(yōu)先使用內(nèi)聯(lián)函數(shù)而不是復(fù)雜的宏。
2.內(nèi)聯(lián)匯編
GCC編譯器支持在C函數(shù)中嵌入?yún)R編指令。注意體系結(jié)構(gòu)的不同,匯編不具有移植性。
3.分支聲明
對(duì)于條件選擇語(yǔ)句,gcc內(nèi)建了一條指令用于優(yōu)化,在一個(gè)條件經(jīng)常出現(xiàn),或者該條件很少出現(xiàn)的時(shí)候,編譯器可以根據(jù)這條指令對(duì)條件分支選擇進(jìn)行優(yōu)化。內(nèi)核把這條指令封裝成了宏,比如likely()和unlikely():
/*foo幾乎不出現(xiàn)*/
if(unlikely(foo))
{}
/*foo經(jīng)常出現(xiàn)*/
if(likely(foo))
{}
轉(zhuǎn)載于:https://www.cnblogs.com/pang123hui/archive/2012/03/08/2385768.html
總結(jié)
以上是生活随笔為你收集整理的慢慢学Linux驱动开发,第十章,GNU C的扩展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 上海欢乐谷碰碰车收费吗
- 下一篇: 长青春痘会不会导致不孕不育