0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

內(nèi)聯(lián)函數(shù)定義 為什么需要內(nèi)聯(lián)函數(shù)

嵌入式與Linux那些事 ? 來源:嵌入式與Linux那些事 ? 2024-02-19 12:20 ? 次閱讀

內(nèi)聯(lián)函數(shù)定義

inline關(guān)鍵字是C99標(biāo)準(zhǔn)的型關(guān)鍵字,其作用是將函數(shù)展開,把函數(shù)的代碼復(fù)制到每一個調(diào)用處。這樣調(diào)用函數(shù)的過程就可以直接執(zhí)行函數(shù)代碼,而不發(fā)生跳轉(zhuǎn)、壓棧等一般性函數(shù)操作。可以節(jié)省時間,也會提高程序的執(zhí)行速度。

為什么需要內(nèi)聯(lián)函數(shù)

C語言中,如果一些函數(shù)被頻繁的調(diào)用,不斷地用函數(shù)入棧,即函數(shù)棧,則會造成??臻g或者棧內(nèi)存的大量消耗,為了解決這個問題,特別的引入了inline關(guān)鍵字,表示為內(nèi)聯(lián)函數(shù)。

??臻g指的是函數(shù)內(nèi)數(shù)據(jù)的內(nèi)存空間,在一個系統(tǒng)下,??臻g的資源是有限的,假如頻繁大量的使用就會因棧空間的不足而導(dǎo)致出錯,函數(shù)的死循壞遞歸調(diào)用的最終結(jié)果就是導(dǎo)致棧內(nèi)存空間的枯竭。

#include
//函數(shù)定義為inline即:內(nèi)聯(lián)函數(shù)
inlinechar*dbtest(inta){
return(i%2>0)?"奇":"偶";
}

intmain()
{
inti=0;
for(i=1;i

上面的例子就是標(biāo)準(zhǔn)的內(nèi)聯(lián)函數(shù)的用法,使用inline修飾帶來的好處我們表面看不出來,其實(shí),在內(nèi)部的工作就是在每個for循環(huán)的內(nèi)部任何調(diào)用dbtest(i)的地方都換成了(i % 2 > 0) ? "奇" : "偶",這樣就避免了頻繁調(diào)用函數(shù)對棧內(nèi)存重復(fù)開辟所帶來的消耗。

內(nèi)聯(lián)函數(shù)注意事項(xiàng)

關(guān)鍵字inline必須與函數(shù)的定義體放在一起,才能使函數(shù)成為內(nèi)聯(lián)函數(shù),僅僅將inline放在函數(shù)聲明前面不起作用

如下風(fēng)格的函數(shù)fun則成為內(nèi)聯(lián)函數(shù):

voidfun(intx,inty);
inlinevoidfun(intx,inty)//inline與函數(shù)的定義放在一起
{

}

關(guān)鍵字inline的使用是有所限制的

inline只適合函數(shù)體內(nèi)代碼比較簡單的函數(shù)使用,不能包含復(fù)雜的結(jié)構(gòu)控制語句,例如while、switch,并且內(nèi)聯(lián)函數(shù)本身不能是直接遞歸函數(shù)(函數(shù)內(nèi)部調(diào)用自己的函數(shù))。

inline僅是一個對編譯器的建議

inline函數(shù)僅僅是一個對編譯器的建議,所以最后能否真正內(nèi)聯(lián),看編譯器的意思,它如果認(rèn)為函數(shù)不復(fù)雜,能在調(diào)用點(diǎn)展開,就會真正內(nèi)聯(lián),并不是說聲明了內(nèi)聯(lián)就會內(nèi)聯(lián),聲明內(nèi)聯(lián)只是一個建議而已。

建議:inline函數(shù)的定義放在頭文件中

其次,因?yàn)閮?nèi)聯(lián)函數(shù)要在調(diào)用點(diǎn)展開,所以編譯器必須隨處可見內(nèi)聯(lián)函數(shù)的定義,要不然就成了非內(nèi)聯(lián)函數(shù)的調(diào)用了。所以,這要求每個調(diào)用了內(nèi)聯(lián)函數(shù)的文件都出現(xiàn)了該內(nèi)聯(lián)函數(shù)的定義。

因此,將內(nèi)聯(lián)函數(shù)的定義放在頭文件里實(shí)現(xiàn)是合適的,省卻你為每個文件實(shí)現(xiàn)一次的麻煩。

聲明跟定義要一致:如果在每個文件里都實(shí)現(xiàn)一次該內(nèi)聯(lián)函數(shù)的話,那么,最好保證每個定義都是一樣的,否則,將會引起未定義的行為。如果不是每個文件里的定義都一樣,那么,編譯器展開的是哪一個,那要看具體的編譯器而定。所以,最好將內(nèi)聯(lián)函數(shù)定義放在頭文件中。

static和inline聯(lián)合使用

static是靜態(tài)修飾符,由其關(guān)鍵字修飾的變量會保存到全局?jǐn)?shù)據(jù)區(qū),對于普通的局部變量或者全局變量,都是由系統(tǒng)自動分配內(nèi)存的,并且當(dāng)變量離開作用域的時候釋放掉,而使用static關(guān)鍵字來修飾,只有當(dāng)程序結(jié)束時候才會釋放掉,使用static inline修飾時,函數(shù)僅在文件內(nèi)部可見,不會污染命名空間,另外,函數(shù)在運(yùn)行過程中也會分配內(nèi)存空間,但是由于static的存在,就和修飾變量類似,它只會開辟一塊內(nèi)存空間。

內(nèi)聯(lián)函數(shù)優(yōu)缺點(diǎn)

普通函數(shù)在調(diào)用過程中,會對寄存器中內(nèi)容進(jìn)行上下文切換(push和pop操作),而內(nèi)聯(lián)函數(shù)則不需要,所以普通函數(shù)相比內(nèi)聯(lián)函數(shù),耗時要多一些。

當(dāng)函數(shù)使用次數(shù)比較多的時候,內(nèi)聯(lián)函數(shù)在每個調(diào)用的地方都會被展開,所以導(dǎo)致固件大小會變大,同一段代碼會多次重復(fù)出現(xiàn)在固件中。而普通函數(shù)則沒有此問題,不管調(diào)用的函數(shù)的次數(shù)多少,函數(shù)在固件中均只占用一處,空間利用率較高。inline函數(shù)其實(shí)就是空間換時間

inline 和宏的區(qū)別

雖然inline函數(shù)和帶參數(shù)的宏很像,但是在使用方法上和宏還是有很大區(qū)別的:

inline()函數(shù) 帶參數(shù)的宏
展開的時機(jī) 在編譯的時候展開,因此inline關(guān)鍵字是一個編譯關(guān)鍵字 在預(yù)處理時展開,因此#define關(guān)鍵字是一個預(yù)處理關(guān)鍵字
參數(shù)類型檢查 inline()函數(shù)是一中函數(shù),會進(jìn)行嚴(yán)格的參數(shù)類型檢查 不會檢查參數(shù)類型,只是做簡單的字符串替換,因此在使用帶參數(shù)的宏時會有一些副作用,編寫程序是要人為預(yù)防
是否允許有復(fù)雜語句 不允許出現(xiàn)復(fù)雜語句,如果出現(xiàn)復(fù)雜語句,該函數(shù)將不會展開,例如遞歸,大型循環(huán)等 對此不做要求。宏只是做字符串替換操作,而不了解語句的含義
是否一定被展開 不一定,是否展開由編譯器決定 一定,只要使用了宏就可以保證被展開
接口封裝
是否支持調(diào)試

總結(jié)

內(nèi)聯(lián)函數(shù)相比宏函數(shù),會進(jìn)行語法檢查。宏函數(shù)是在預(yù)處理階段生效,內(nèi)聯(lián)函數(shù)是在編譯階段進(jìn)行語法檢查然后替換。

內(nèi)聯(lián)函數(shù)相比普通函數(shù),少了上下文切換的步驟所以執(zhí)行會更快一些。

內(nèi)聯(lián)函數(shù)被多次調(diào)用,會使固件大小膨脹,內(nèi)聯(lián)函數(shù)的高速是以空間來換時間。

內(nèi)聯(lián)函數(shù)不可遞歸。

如果函數(shù)內(nèi)容太過于復(fù)雜,編譯器會忽略inline關(guān)鍵字,把他當(dāng)成普通函數(shù)來處理。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136841
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1634

    瀏覽量

    49133

原文標(biāo)題:【C語言】內(nèi)聯(lián)函數(shù)總結(jié)

文章出處:【微信號:嵌入式與Linux那些事,微信公眾號:嵌入式與Linux那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    RealView MDK中使用內(nèi)聯(lián)函數(shù)需要注意的問題

    的文件中申明為extern類型。原因是MDK中使用的__inline函數(shù)時和標(biāo)準(zhǔn)C++中的inline函數(shù)有相同的語義。在C++標(biāo)準(zhǔn)中,一個內(nèi)聯(lián)函數(shù)在用到它的每個解釋單元
    發(fā)表于 08-02 10:10

    內(nèi)聯(lián)函數(shù)簡介

    1.內(nèi)聯(lián)函數(shù)在C++中我們通常定義以下函數(shù)來求兩個整數(shù)的最大值:復(fù)制代碼 代碼如下:int max(int a, int b){return a > b ? a : b;}為這么一個小
    發(fā)表于 09-11 16:22

    基于SUIF的函數(shù)內(nèi)聯(lián)技術(shù)

    從基于調(diào)用圖的函數(shù)內(nèi)聯(lián)技術(shù)、函數(shù)參數(shù)的映射技術(shù)和內(nèi)聯(lián)使用的不同策略3 個方面討論基于SUIF 系統(tǒng)的內(nèi)聯(lián)技術(shù)的實(shí)現(xiàn)。根據(jù)KAP 系統(tǒng)需求,提
    發(fā)表于 03-28 09:50 ?6次下載

    C++如何處理內(nèi)聯(lián)函數(shù)

    當(dāng)一個函數(shù)內(nèi)聯(lián)和虛函數(shù)時,會發(fā)生代碼替換或使用虛表調(diào)用嗎? 為了弄 清楚內(nèi)聯(lián)和虛函數(shù),讓我們將它們分開來考慮。通常,一個
    發(fā)表于 11-29 11:59 ?28次下載

    內(nèi)聯(lián)函數(shù)詳解

    什么是內(nèi)聯(lián)性和外聯(lián)函數(shù) 類的成員函數(shù)可以分為內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)
    發(fā)表于 11-02 14:05 ?0次下載

    內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)有什么區(qū)別

    內(nèi)聯(lián)函數(shù)是指用inline關(guān)鍵字修飾的函數(shù)。在類內(nèi)定義函數(shù)被默認(rèn)成內(nèi)聯(lián)
    發(fā)表于 12-15 11:52 ?5870次閱讀
    <b class='flag-5'>內(nèi)聯(lián)</b><b class='flag-5'>函數(shù)</b>和外聯(lián)<b class='flag-5'>函數(shù)</b>有什么區(qū)別

    Java之內(nèi)聯(lián)函數(shù)_內(nèi)聯(lián)函數(shù)的優(yōu)缺點(diǎn)

    內(nèi)聯(lián)函數(shù)就是指函數(shù)在被調(diào)用的地方直接展開,編譯器在調(diào)用時不用像一般函數(shù)那樣,參數(shù)壓棧,返回時參數(shù)出棧以及資源釋放等,這樣提高了程序執(zhí)行速度。Java語言中有一個關(guān)鍵字final來指明那
    發(fā)表于 12-15 15:00 ?3270次閱讀

    C++基礎(chǔ)語法之inline 內(nèi)聯(lián)函數(shù)

    函數(shù)處; 相當(dāng)于不用執(zhí)行進(jìn)入函數(shù)的步驟,直接執(zhí)行函數(shù)體; 相當(dāng)于宏,卻比宏多了類型檢查,真正具有函數(shù)特性; 編譯器一般不內(nèi)聯(lián)包含循環(huán)、遞歸、
    的頭像 發(fā)表于 09-09 09:38 ?2150次閱讀

    C++語法中的inline內(nèi)聯(lián)函數(shù)詳解

    函數(shù)處; 相當(dāng)于不用執(zhí)行進(jìn)入函數(shù)的步驟,直接執(zhí)行函數(shù)體; 相當(dāng)于宏,卻比宏多了類型檢查,真正具有函數(shù)特性; 編譯器一般不內(nèi)聯(lián)包含循環(huán)、遞歸、
    的頭像 發(fā)表于 09-09 09:33 ?3363次閱讀

    msp430學(xué)習(xí)1——msp內(nèi)聯(lián)函數(shù)

    通過 鎖相環(huán)倍頻來提高系統(tǒng)運(yùn)行速度是有一個限制的, 最高只能到25MHZ(再高沒意思了)。 (2)幾個重要的內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)
    發(fā)表于 12-16 16:56 ?7次下載
    msp430學(xué)習(xí)1——msp<b class='flag-5'>內(nèi)聯(lián)</b><b class='flag-5'>函數(shù)</b>

    C語言-內(nèi)聯(lián)函數(shù)、遞歸函數(shù)、指針函數(shù)

    這篇文章介紹C語言的內(nèi)聯(lián)函數(shù)、遞歸函數(shù)、函數(shù)指針、指針函數(shù)、局部地址、const關(guān)鍵字、extern關(guān)鍵字等知識點(diǎn);這些知識點(diǎn)在實(shí)際項(xiàng)目開發(fā)
    的頭像 發(fā)表于 08-14 10:03 ?1693次閱讀

    講解下C語言的內(nèi)聯(lián)函數(shù)

    內(nèi)聯(lián)函數(shù)是C語言從C++中借鑒過來的,適當(dāng)?shù)氖褂?b class='flag-5'>內(nèi)聯(lián)函數(shù)可以提高程序的執(zhí)行效率。
    的頭像 發(fā)表于 02-16 09:15 ?1500次閱讀

    C語言內(nèi)聯(lián)函數(shù),提升C技巧必備

    內(nèi)聯(lián)函數(shù)是C語言從C++中借鑒過來的,適當(dāng)?shù)氖褂?b class='flag-5'>內(nèi)聯(lián)函數(shù)可以提高程序的執(zhí)行效率。本篇文章就來講解下內(nèi)聯(lián)
    的頭像 發(fā)表于 02-16 09:16 ?794次閱讀

    C語言內(nèi)聯(lián)函數(shù)

    函數(shù)B很小,又被頻繁的調(diào)用,可能函數(shù)調(diào)用的切換時間比函數(shù)內(nèi)代碼的執(zhí)行時間還長,這樣明顯劃不來,那么我們就可以將這個函數(shù)聲明為內(nèi)聯(lián)(加上 in
    的頭像 發(fā)表于 02-21 16:55 ?954次閱讀
    C語言<b class='flag-5'>內(nèi)聯(lián)</b><b class='flag-5'>函數(shù)</b>

    宏的缺陷與內(nèi)聯(lián)函數(shù)的引入

    。 所以為了解決這種不利于調(diào)試的問題,就有了內(nèi)聯(lián)函數(shù)。 那么什么是內(nèi)聯(lián)函數(shù)呢? 我們以inline修飾的函數(shù)叫做
    的頭像 發(fā)表于 11-01 17:57 ?450次閱讀