stm32 庫文件_line 函數
內聯(lián)函數從源代碼層看,有函數的結構,而在編譯后,卻不具備函數的性質(zhì)。編譯時(shí),類(lèi)似宏替換,使用函數體替換調用處的函數名。一般在代碼中用inline修飾,但是否能形成內聯(lián)函數,需要看編譯器對該函數定義的具體處理。
本文引用地址:http://dyxdggzs.com/article/201611/317114.htm動(dòng)機
內聯(lián)擴展是用來(lái)消除函數調用時(shí)的時(shí)間開(kāi)銷(xiāo)。它通常用于頻繁執行的函數。一個(gè)小內存空間的函數非常受益。如果沒(méi)有內聯(lián)函數,編譯器可以決定哪些函數內聯(lián)。程序員很少或沒(méi)有控制哪些職能是內聯(lián)的,哪些不是。給這種控制程度,作用是程序員可以選擇內聯(lián)的特定應用。
函數內聯(lián)問(wèn)題
除了相關(guān)的問(wèn)題,內聯(lián)擴展一般,語(yǔ)言功能作為一個(gè)內聯(lián)函數可能不被視為有價(jià)值的,因為它們出現的原因,對于一個(gè)數字:
通常,一個(gè)編譯器是在一個(gè)比人類(lèi)更有利的地位來(lái)決定某一特定功能是否應該被內聯(lián)。有時(shí),編譯器可能無(wú)法盡可能多的功能內嵌作為程序員表示。
一個(gè)重要的一點(diǎn)需要注意的是代碼(內聯(lián)函數)得到暴露其客戶(hù)端(調用函數)。
隨著(zhù)功能的演變,它們有可能成為合適的內聯(lián),他們不前,或不再在他們面前的內聯(lián)合適。而內聯(lián)或取消內聯(lián)函數比從宏轉換為更容易,但仍需要額外的維修,一般產(chǎn)量相對較少的利益。
用于本機C型編譯系統的擴散可以增加編譯時(shí)間,因為他們的身體的中間表示是到每個(gè)調用點(diǎn),他們都是內聯(lián)復制內聯(lián)函數。在代碼大小可能增加是由在編譯時(shí)間可能增加鏡像。
C99中內嵌的規范要求只有一個(gè)額外在另一個(gè)編譯單元,功能的外部定義時(shí),相應的內聯(lián)定義,可以發(fā)生在不同的編譯單元多次,如果該函數用于地方。這很容易導致連接器,因為這樣的定義不是由程序員提供的錯誤。出于這個(gè)原因,往往是在C99內聯(lián)一起使用靜態(tài)的,也給出了函數的內部聯(lián)系。
在C++,有必要定義一個(gè)在每一個(gè)模塊(編譯單元)內聯(lián)函數使用一個(gè)普通的功能,而必須在只有一個(gè)模塊中定義它。否則,就不可能編制的所有其他模塊一個(gè)模塊獨立。
對于功能問(wèn)題與優(yōu)化本身,而不是語(yǔ)言,請參閱使用內聯(lián)擴展問(wèn)題。
宏比較
內聯(lián)函數的功能和預處理宏的功能相似。相信大家都用過(guò)預處理宏,我們會(huì )經(jīng)常定義一些宏,如
#defineTABLE_COMP(x)((x)>0?(x):0)
就定義了一個(gè)宏。
為什么要使用宏呢?因為函數的調用必須要將程序執行的順序轉移到函數
所存放在內存中的某個(gè)地址,將函數的程序內容執行完后,再返回到轉去執行
該函數前的地方。這種轉移操作要求在轉去執行前要保存現場(chǎng)并記憶執行的地
址,轉回后要恢復現場(chǎng),并按原來(lái)保存地址繼續執行。因此,函數調用要有一
定的時(shí)間和空間方面的開(kāi)銷(xiāo),于是將影響其效率。而宏只是在預處理的地方把
代碼展開(kāi),不需要額外的空間和時(shí)間方面的開(kāi)銷(xiāo),所以調用一個(gè)宏比調用一個(gè)
函數更有效率。
但是宏也有很多的不盡人意的地方。
1、.宏不能訪(fǎng)問(wèn)對象的私有成員。
2、.宏的定義很容易產(chǎn)生二意性。
我們舉個(gè)例子:
#defineTABLE_MULTI(x)(x*x)
我們用一個(gè)數字去調用它,TABLE_MULTI(10),這樣看上去沒(méi)有什么錯誤,
結果返回100,是正確的,但是如果我們用TABLE_MULTI(10+10)去調用的話(huà),
我們期望的結果是400,而宏的調用結果是(10+10*10+10),結果是120,這顯
然不是我們要得到的結果。避免這些錯誤的方法,一是給宏的參數都加上括號。
#defineTABLE_MULTI(x)((x)*(x))
這樣可以確保不會(huì )出錯,但是,即使使用了這種定義,這個(gè)宏依然有可能
出錯,例如使用TABLE_MULTI(a++)調用它,他們本意是希望得到(a+1)*(a+1)的
結果,而實(shí)際上呢?我們可以看看宏的展開(kāi)結果:(a++)*(a++),如果a的值是
4,我們得到的結果是4*4=16,a=6。而我們期望的結果是5*5=25,這又出現了問(wèn)題。
事實(shí)上,在一些C的庫函數中也有這些問(wèn)題。例如:Toupper(*pChar++)就會(huì )對
pChar執行兩次++操作,因為T(mén)oupper實(shí)際上也是一個(gè)宏。
我們可以看到宏有一些難以避免的問(wèn)題,怎么解決呢?
下面就是用我要介紹的內聯(lián)函數來(lái)解決這些問(wèn)題,我們可以使用內聯(lián)函數
來(lái)取代宏的定義。而且事實(shí)上我們可以用內聯(lián)函數完全取代預處理宏。
內聯(lián)函數和宏的區別在于,宏是由預處理器對宏進(jìn)行替代,而內聯(lián)函數是
通過(guò)編譯器控制來(lái)實(shí)現的。而且內聯(lián)函數是真正的函數,只是在需要用到的時(shí)
候,內聯(lián)函數像宏一樣的展開(kāi),所以取消了函數的參數壓棧,減少了調用的開(kāi)
銷(xiāo)。你可以象調用函數一樣來(lái)調用內聯(lián)函數,而不必擔心會(huì )產(chǎn)生于處理宏的一
些問(wèn)題。
我們可以用Inline來(lái)定義內聯(lián)函數,不過(guò),任何在類(lèi)的說(shuō)明部分定義的函
數都會(huì )被自動(dòng)的認為是內聯(lián)函數。
下面我們來(lái)介紹一下內聯(lián)函數的用法。
內聯(lián)函數必須是和函數體申明在一起,才有效。像這樣的申明
InlineTablefunction(intI)是沒(méi)有效果的,編譯器只是把函數作為普通的函
數申明,我們必須定義函數體。
Inlinetablefunction(intI){returnI*I};
這樣我們才算定義了一個(gè)內聯(lián)函數。我們可以把它作為一般的函數一樣調
用。但是執行速度確比一般函數的執行速度要快。
我們也可以將定義在類(lèi)的外部的函數定義為內聯(lián)函數,比如:
ClassTableClass{
Private:
IntI,j;
Public:
Intadd(){returnI+j;};
Inlineintdec(){returnI-j;}
IntGetNum();
}
inlineinttableclass::GetNum(){
returnI;
}
上面申明的三個(gè)函數都是內聯(lián)函數。在C++中,在類(lèi)的內部定義了函數體的
函數,被默認為是內聯(lián)函數。而不管你是否有inline關(guān)鍵字。
內聯(lián)函數在C++類(lèi)中,應用最廣的,應該是用來(lái)定義存取函數。我們定義的
類(lèi)中一般會(huì )把數據成員定義成私有的或者保護的,這樣,外界就不能直接讀寫(xiě)我
們類(lèi)成員的數據了。
對于私有或者保護成員的讀寫(xiě)就必須使用成員接口函數來(lái)進(jìn)行。如果我們把
這些讀寫(xiě)成員函數定義成內聯(lián)函數的話(huà),將會(huì )獲得比較好的效率。
Classsample{
Private:
IntnTest;
Public:
Intreadtest(){returnnTest;}
Voidsettest(intI){nTest=I;}
}
當然,內聯(lián)函數也有一定的局限性。就是函數中的執行代碼不能太多了,如
果,內聯(lián)函數的函數體過(guò)大,一般的編譯器會(huì )放棄內聯(lián)方式,而采用普通的方式
調用函數。這樣,內聯(lián)函數就和普通函數執行效率一樣了。
注意事項
使用內聯(lián)函數應注意的事項
內聯(lián)函數具有一般函數的特性,它與一般函數所不同之處只在于函數調用的處理。一般函數進(jìn)行調用時(shí),要將程序執行權轉到被調用函數中,然后再返回到調用它的函數中;而內聯(lián)函數在調用時(shí),是將調用表達式用內聯(lián)函數體來(lái)替換。在使用內聯(lián)函數時(shí),應注意如下幾點(diǎn): 1.在內聯(lián)函數內不允許用循環(huán)語(yǔ)句和開(kāi)關(guān)語(yǔ)句?!∪绻麅嚷?lián)函數有這些語(yǔ)句,則編譯將該函數視同普通函數那樣產(chǎn)生函數調用代碼,遞歸函數(自己調用自己的函數)是不能被用來(lái)做內聯(lián)函數的。內聯(lián)函數只適合于只有1~5行的小函數。對一個(gè)含有許多語(yǔ)句的大函數,函數調用和返回的開(kāi)銷(xiāo)相對來(lái)說(shuō)微不足道,所以也沒(méi)有必要用內聯(lián)函數實(shí)現?!?.內聯(lián)函數的定義必須出現在內聯(lián)函數第一次被調用之前?!?.本欄目講到的類(lèi)結構中所有在類(lèi)說(shuō)明內部定義的函數是內聯(lián)函數。
評論