<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > stm32 庫文件_line 函數

stm32 庫文件_line 函數

作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò ) 收藏
定義  

內聯(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)函數。



關(guān)鍵詞: stm32庫文件_line函

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>