linux源碼中staticinline的分析.doc

linux源碼中staticinline的分析.doc

ID:62033754

大?。?8.00 KB

頁數(shù):7頁

時(shí)間:2021-04-15

linux源碼中staticinline的分析.doc_第1頁
linux源碼中staticinline的分析.doc_第2頁
linux源碼中staticinline的分析.doc_第3頁
linux源碼中staticinline的分析.doc_第4頁
linux源碼中staticinline的分析.doc_第5頁
資源描述:

《linux源碼中staticinline的分析.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。

1、【賽迪網(wǎng)訊】inline屬性在使用的時(shí)候,要注意以下兩點(diǎn):inline關(guān)鍵字在GCC參考文檔中僅有對(duì)其使用在函數(shù)定義(Definition)上的描述,而沒有提到其是否能用于函數(shù)聲明(Declare)。從inline的作用來看,其放置于函數(shù)聲明中應(yīng)當(dāng)也是毫無作用的:inline只會(huì)影響函數(shù)在translationunit(可以簡(jiǎn)單理解為C源碼文件)內(nèi)的編譯行為,只要超出了這個(gè)范圍inline屬性就沒有任何作用了。所以inline關(guān)鍵字不應(yīng)該出現(xiàn)在函數(shù)聲明中,沒有任何作用不說,有時(shí)還可能造成編譯錯(cuò)誤(在包含了sys/compiler。h的情況下,聲明中出現(xiàn)inline關(guān)鍵字的部分通

2、常無法編譯通過);inline關(guān)鍵字僅僅是建議編譯器做內(nèi)聯(lián)展開處理,而不是強(qiáng)制。在gcc編譯器中,如果編譯優(yōu)化設(shè)置為-O0,即使是inline函數(shù)也不會(huì)被內(nèi)聯(lián)展開,除非設(shè)置了強(qiáng)制內(nèi)聯(lián)(__attribute__((always_inline)))屬性。1. GCC的inlinegcc對(duì)C語言的inline做了自己的擴(kuò)展,其行為與C99標(biāo)準(zhǔn)中的inline有較大的不同。1。1。staticinlineGCC的staticinline定義很容易理解:你可以把它認(rèn)為是一個(gè)static的函數(shù),加上了inline的屬性。這個(gè)函數(shù)大部分表現(xiàn)和普通的static函數(shù)一樣,只不過在調(diào)用這種函數(shù)

3、的時(shí)候,gcc會(huì)在其調(diào)用處將其匯編碼展開編譯而不為這個(gè)函數(shù)生成獨(dú)立的匯編碼。除了以下幾種情況外: 函數(shù)的地址被使用的時(shí)候。如通過函數(shù)指針對(duì)函數(shù)進(jìn)行了間接調(diào)用。這種情況下就不得不為staticinline函數(shù)生成獨(dú)立的匯編碼,否則它沒有自己的地址。其他一些無法展開的情況,比如函數(shù)本身有遞歸調(diào)用自身的行為等。stat(yī)icinline函數(shù)和static函數(shù)一樣,其定義的范圍是local的,即可以在程序內(nèi)有多個(gè)同名的定義(只要不位于同一個(gè)文件內(nèi)即可).注意:gcc的staticinline的表現(xiàn)行為和C99標(biāo)準(zhǔn)的staticinline是一致的。所以這種定義可以放心使用而沒有兼容性問題

4、。要點(diǎn): gcc的static inline相對(duì)于static函數(shù)來說只是在調(diào)用時(shí)建議編譯器進(jìn)行內(nèi)聯(lián)展開;gcc不會(huì)特意為staticinline函數(shù)生成獨(dú)立的匯編碼,除非出現(xiàn)了必須生成不可的情況(如通過函數(shù)指針調(diào)用和遞歸調(diào)用);?。鏲c的staticinline函數(shù)僅能作用于文件范圍內(nèi)。1.2。inline相對(duì)于C99的inline來說,GCC的inline更容易理解:可以認(rèn)為它是一個(gè)普通全局函數(shù)加上了inline的屬性。即在其定義所在文件內(nèi),它的表現(xiàn)和staticinline一致:在能展開的時(shí)候會(huì)被內(nèi)聯(lián)展開編譯。但是為了能夠在文件外調(diào)用它,gcc一定會(huì)為它生成一份獨(dú)立的匯編

5、碼,以便在外部進(jìn)行調(diào)用。即從文件外部看來,它和一個(gè)普通的extern的函數(shù)無異。舉個(gè)例子:foo。c:/*這里定義了一個(gè)inline的函數(shù)foo()*/inline?。妫飋(){編譯器會(huì)像非inline函數(shù)一樣為foo()生成獨(dú)立的匯編碼}voidfunc1()?。oo();同文件內(nèi)foo()可能被編譯器內(nèi)聯(lián)展開編譯而不是直接call上面生成的匯編碼} 而在另一個(gè)文件里調(diào)用foo()的時(shí)候,則直接call的是上面文件內(nèi)生成的匯編碼:bar.c:extern foo(); 聲明foo(),注意不能在聲明內(nèi)帶inline關(guān)鍵字voidfunc2() {foo();這里就是直接c

6、all在foo。c內(nèi)為foo()函數(shù)生成的匯編碼了雖然gcc的inline函數(shù)的行為很好理解,但是它和C99的inline是有很大差別的.請(qǐng)注意看后面對(duì)C99inline的描述(第 2.2節(jié) “inline”),以及如何以兼顧GCC和C99的方式使用inline函數(shù)。要點(diǎn):gcc的inline函數(shù)相對(duì)于普通extern函數(shù)來說只是在同一個(gè)文件內(nèi)調(diào)用時(shí)建議編譯器進(jìn)行內(nèi)聯(lián)展開;gcc一定會(huì)為inline函數(shù)生成一份獨(dú)立的匯編碼,以便其在本文件之外被調(diào)用。在別的文件內(nèi)看來,這個(gè)inline函數(shù)和普通的extern函數(shù)無異; gcc的inline函數(shù)是全局性的:在文件內(nèi)可以作為一個(gè)內(nèi)聯(lián)

7、函數(shù)被內(nèi)聯(lián)展開,而在文件外可以調(diào)用它。1。3.externinlineGCC的staticinline和inline都很好理解:看起來都像是對(duì)普通函數(shù)添加了可內(nèi)聯(lián)的屬性。但是這個(gè)externinline就千萬不能想當(dāng)然地理解成就是一個(gè)extern的函數(shù)+inline屬性了。實(shí)際上gcc的externinline十分古怪:一個(gè)externinline的函數(shù)只會(huì)被內(nèi)聯(lián)進(jìn)去,而絕對(duì)不會(huì)生成獨(dú)立的匯編碼!即使是通過指針應(yīng)用或者是遞歸調(diào)用也不會(huì)讓編譯器為它生成匯編碼,在這種時(shí)候?qū)Υ撕瘮?shù)的調(diào)用會(huì)被處理成

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。