<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è) > 嵌入式系統 > 設計應用 > 內聯(lián)函數詳解

內聯(lián)函數詳解

作者: 時(shí)間:2010-05-24 來(lái)源:網(wǎng)絡(luò ) 收藏

什么是內聯(lián)性和外聯(lián)函數

本文引用地址:http://dyxdggzs.com/article/257961.htm

類(lèi)的成員函數可以分為和外聯(lián)函數。是指那些定義在類(lèi)體內的成員函數,即該函數的函數體放在類(lèi)體內。而說(shuō)明在類(lèi)體內,定義在類(lèi)體外的成員函數叫外聯(lián)函數。外聯(lián)函數的函數體在類(lèi)的實(shí)現部分。

在調用時(shí)不是像一般的函數那樣要轉去執行被調用函數的函數體,執行完成后再轉回調用函數中,執行其后語(yǔ)句,而是在調用函數處用內聯(lián)函數體的代碼來(lái)替換,這樣將會(huì )節省調用開(kāi)銷(xiāo),提高運行速度。

內聯(lián)函數與前面講過(guò)的帶參數的宏定義進(jìn)行一下比較,它們的代碼效率是一樣的,但是內聯(lián)函數要優(yōu)于宏定義,因為內聯(lián)函數遵循函數的類(lèi)型和作用域規則,它與一般函數更相近,在一些編譯器中,一旦關(guān)上內聯(lián)擴展,將與一般函數一樣進(jìn)行調用,調試比較方便。

外聯(lián)函數變成內聯(lián)函數的方法很簡(jiǎn)單,只要在函數頭前面加上關(guān)鍵字就可以了。


#include iostream>
using namespace std;
class A
{
public:
A(int x, int y) //內聯(lián)函數
{
X=x;Y=y;
}
int a() //內聯(lián)函數
{
return X;
}
int b() //內聯(lián)函數
{
return Y;
}
int c();
int d();
private:
int X,Y;
};
//定義內聯(lián)函數
int A::c()
{
return a()+b();
}
inline int A::d()
{
return c();
}

void main()
{
A m(3,5);
int I=m.d();
coutd()return:Iendl;
}


輸出結果:

d()return:8

說(shuō)明:類(lèi)A中,直接定義了3個(gè)內聯(lián)函數,又使用inline定義了2個(gè)內聯(lián)函數。


引入內聯(lián)函數的意義

函數是一種更高級的抽象。它的引入使得編程者只關(guān)心函數的功能和使用方法,而不必關(guān)心函數功能的具體實(shí)現;函數的引入可以減少程序的目標代碼,實(shí)現程序代碼和數據的共享。但是,函數調用也會(huì )帶來(lái)降低效率的問(wèn)題,因為調用函數實(shí)際上將程序執行順序轉移到函數所存放在內存中某個(gè)地址,將函數的程序內容執行完后,再返回到轉去執行該函數前的地方。這種轉移操作要求在轉去前要保護現場(chǎng)并記憶執行的地址,轉回后先要恢復現場(chǎng),并按原來(lái)保存地址繼續執行。因此,函數調用要有一定的時(shí)間和空間方面的開(kāi)銷(xiāo),于是將影響其效率。特別是對于一些函數體代碼不是很大,但又頻繁地被調用的函數來(lái)講,解決其效率問(wèn)題更為重要。引入內聯(lián)函數實(shí)際上就是為了解決這一問(wèn)題。

在程序編譯時(shí),編譯器將程序中出現的內聯(lián)函數的調用表達式用內聯(lián)函數的函數體來(lái)進(jìn)行替換。顯然,這種做法不會(huì )產(chǎn)生轉去轉回的問(wèn)題,但是由于在編譯時(shí)將函數體中的代碼被替代到程序中,因此會(huì )增加目標程序代碼量,進(jìn)而增加空間開(kāi)銷(xiāo),而在時(shí)間代銷(xiāo)上不象函數調用時(shí)那么大,可見(jiàn)它是以目標代碼的增加為代價(jià)來(lái)?yè)Q取時(shí)間的節省。

在程序中,調用其函數時(shí),該函數在編譯時(shí)被替代,而不是像一般函數那樣是在運行時(shí)被調用。


使用內聯(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í)現。

2.內聯(lián)函數的定義必須出現在內聯(lián)函數第一次被調用之前。

3.本欄目講到的類(lèi)結構中所有在類(lèi)說(shuō)明內部定義的函數是內聯(lián)函數。



關(guān)鍵詞: 內聯(lián)函數 性能 inline

評論


相關(guān)推薦

技術(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>