chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

詳細(xì)解析內(nèi)聯(lián)函數(shù)以及在C語言中的作用

5RJg_mcuworld ? 2017-12-21 14:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

內(nèi)聯(lián)函數(shù)的作用

內(nèi)聯(lián)函數(shù)是一種編譯機(jī)制,優(yōu)點(diǎn)從代碼上是看不出來的,但是程序的執(zhí)行效率上有差別,通常,編譯器對(duì)函數(shù)調(diào)用的處理是一種類似中斷的方式,即當(dāng)執(zhí)行到函數(shù)調(diào)用語句時(shí),程序把當(dāng)前所有的狀態(tài)信息比如CPU所有寄存器(其中一個(gè)很重要的就是指令指針寄存器)的值保存起來,然后放心大膽地轉(zhuǎn)去執(zhí)行那個(gè)函數(shù)的代碼,執(zhí)行完后再返回原來的地方,恢復(fù)原先保存過的狀態(tài)信息,于是也就可以接著原來被中斷的指令繼續(xù)往下執(zhí)行。

這樣,就很容易實(shí)現(xiàn)代碼的結(jié)構(gòu)化,因?yàn)榭梢园岩恍┆?dú)立的功能模塊寫成函數(shù),函數(shù)內(nèi)部的變量和外部的變量互不影響,而且函數(shù)執(zhí)行完后就可以釋放這個(gè)函數(shù)內(nèi)部變量的所使用的內(nèi)存空間(這就是為什么函數(shù)退出后,其內(nèi)部變量不再有效),對(duì)內(nèi)存的使用也是很經(jīng)濟(jì)的(否則,如果一個(gè)大的程序全部由一個(gè)函數(shù)組成,那么所有的變量都得自始至終地占用內(nèi)存空間),當(dāng)然,還有其他優(yōu)點(diǎn),比如可以實(shí)現(xiàn)遞歸,總之是好處多多。

可是,任何事情往往都有兩方面,這樣做雖然好處多多,但也是有代價(jià)的,那就是前面所說的,任何一次函數(shù)調(diào)用,程序都得進(jìn)行保存和恢復(fù)狀態(tài)信息的動(dòng)作,用數(shù)據(jù)結(jié)構(gòu)的術(shù)語說就是進(jìn)棧和退棧,當(dāng)然,還有內(nèi)存分配的過程,如果函數(shù)的代碼非常少,這種代價(jià)并不是可忽略的,比如說,你編寫一個(gè)類,里面有個(gè)記錄狀態(tài)的成員變量:

Class MyClass

{

private:

int m_iState;

}

按照面向?qū)ο蟮乃枷?,函?shù)的屬性應(yīng)盡量的私有化,但外部怎么獲得這個(gè)屬性值呢?一般的方法就是加一個(gè)共有函數(shù),這就實(shí)現(xiàn)的面向?qū)ο笏枷胫兴^“通過公用接口操作對(duì)象的私有屬性”。于是就變成了:

Class MyClass

{

public:

int GetState();

private:

int m_iState;

}

int MyClass::GetState()

{

return m_iState;

}

這樣一來,面向?qū)ο笏枷氲故求w現(xiàn)出來了,但你的CPU會(huì)恨你:“你丫一個(gè)鳥函數(shù)就返回一個(gè)整數(shù)卻讓老子進(jìn)一次棧、彈一次?!保瑑?nèi)存也會(huì)埋怨:“兄弟也得跟著分配內(nèi)存!”

但對(duì)你來說,也很委屈,怎么辦,把所有的屬性都改成public?讓外部?jī)?nèi)碼直接訪問?況且,那樣也不解決所有問題,因?yàn)橛袝r(shí)候即使不是為了面向?qū)ο?,我們也需要把?dú)立的功能模塊做成函數(shù),比如說產(chǎn)生隨機(jī)數(shù)的函數(shù)。我想

int iRand=rand();

總比:

int iRand=((int)(MULTIPLIER * Seed + INCREMENT)》》16)&0x7fff;

看起來舒服吧?(我這里只是打個(gè)比方,VC的rand函數(shù)并不是內(nèi)聯(lián)函數(shù))

而內(nèi)聯(lián)函數(shù)就是解決這個(gè)問題了,對(duì)于程序員,他還是把獨(dú)立功能寫成函數(shù)的形式,但只要聲明為內(nèi)聯(lián),編譯器就不把它編譯成一次函數(shù)調(diào)用,而只是類似于把函數(shù)的代碼拷貝到被調(diào)用的地方,而且這完全是編譯器私下里完成的,原來的訪問權(quán)限等問題絲毫不受影響。這不是兩全齊美了嗎:在保證代碼的面向?qū)ο笮院徒Y(jié)構(gòu)化不受損失的條件下,程序的效率也沒有損失,比如上面那個(gè)類,就變成了:

Class MyClass

{

public:

inline int GetState();

private:

int m_iState;

}

int inline MyClass::GetState()

{

return m_iState;

}

有一點(diǎn)要注意,內(nèi)聯(lián)函數(shù)要跟類的聲明寫在同一個(gè)文件中,否則編譯會(huì)出錯(cuò)。按照VC管理源文件的風(fēng)格來說,就是內(nèi)聯(lián)函數(shù)最好寫在聲明類的.h文件中,而不是像一般函數(shù)那樣寫在實(shí)現(xiàn)類的.cpp文件中。

當(dāng)然,內(nèi)聯(lián)函數(shù)還有另外一種寫法,就是直接寫在類中,此時(shí),不必使用“inline”關(guān)鍵字。

Class MyClass

{

public:

int GetState(){ return m_iState; }

private:

int m_iState;

}

最后,還要注意,內(nèi)聯(lián)函數(shù)只是一種編譯機(jī)制,用上面兩種形式聲明的函數(shù)僅僅是建議編譯器進(jìn)行內(nèi)聯(lián),而編譯器是否內(nèi)聯(lián)不一定。正如前面所說,函數(shù)調(diào)用的開銷只是對(duì)小的函數(shù)不可忽略,對(duì)于重量級(jí)的函數(shù)還是可以忽略的,而且在絕大多數(shù)的場(chǎng)合,函數(shù)調(diào)用才是人間正道,才是解決問題的最佳。所以大多數(shù)編譯器并不把帶有循環(huán)、遞歸等或者代碼比較多的函數(shù)進(jìn)行內(nèi)聯(lián)編譯,有的甚至不允許聲明成內(nèi)聯(lián)的。

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

[cpp] view plain copy關(guān)內(nèi)聯(lián)函數(shù)鍵字inline

[cpp] view plain copyvoid myprintf(int a)

{

priintf(“%d”,a);

}

int main()

{

for(i=0;i《100;i++)

myprintf(3);

}

對(duì)于這個(gè)函數(shù),在進(jìn)行反復(fù)的打印3的過程中我們是不是要反復(fù)的調(diào)用myprintf(int a)這個(gè)函數(shù),進(jìn)函數(shù)和出函數(shù)是需要時(shí)間的,假設(shè)這個(gè)過程用時(shí)為4ms,而執(zhí)行printf這個(gè)操作只需要2ms,那么在100次循環(huán)的過程中進(jìn)出函數(shù)的時(shí)間比函數(shù)功能printf需要的時(shí)間還要長(zhǎng),這樣很影響工作效率。于是,我們就想要如何去免去進(jìn)出函數(shù)的過程呢?那么就可以聲明inline這個(gè)關(guān)鍵字,有何用途?當(dāng)我們聲明了一個(gè)inline的函數(shù)時(shí)候,函數(shù)被調(diào)用的語句就被替換成了函數(shù)本身,進(jìn)行了一個(gè)預(yù)處理

[cpp] view plain copyint main()

{

for(i=0;i《100;i++)

void myprintf(3)

{

printf(“%d”,3);

}

return 0;

}

這樣一來我就非常明顯的知道這個(gè)函數(shù)是干什么的了,就不需要去調(diào)用函數(shù)的定義部分,再通俗點(diǎn)講,原來我要從家里去外面的商店去買冰淇淋(來回需要時(shí)間),現(xiàn)在商店就在我家里面了,那么我是不是省去了去商店的時(shí)間呢?但是相應(yīng)的我這個(gè)家要很大(也就是所謂的空間要很大才能包含這個(gè)商店對(duì)吧?)這樣就是用空間去換取了時(shí)間了。

內(nèi)聯(lián)函數(shù)在編譯層面類似于宏替換。也就是說,程序執(zhí)行過程中調(diào)用內(nèi)聯(lián)函數(shù)不需要入棧出棧,所以效率會(huì)提高。

[cpp] view plain copy#include《stdio.h》

inline int add(int x, int y)

{

return x+y;

}

int main()

{

int i,j,k;

printf(“請(qǐng)輸入兩個(gè)整數(shù)的值:”);

scanf(“%d%d”,&i,&j);

k=add(i,j);

printf(“k=%d\n”,k);

return 0;

}


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

    關(guān)注

    183

    文章

    7642

    瀏覽量

    145125
  • 內(nèi)聯(lián)函數(shù)

    關(guān)注

    0

    文章

    10

    瀏覽量

    2431

原文標(biāo)題:內(nèi)聯(lián)函數(shù)在C語言中的作用

文章出處:【微信號(hào):mcuworld,微信公眾號(hào):嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語言回調(diào)函數(shù)原來這么簡(jiǎn)單

    了解開發(fā)語言的朋友應(yīng)該都會(huì)對(duì)回調(diào)函數(shù)有所了解,很多的程序開發(fā)語言中都能看到回調(diào)的身影。很多場(chǎng)景下,當(dāng)某個(gè)條件成立以后我們**代碼執(zhí)行某些指定的部分,這個(gè)時(shí)候可以考慮使用回調(diào)
    發(fā)表于 12-30 06:45

    C語言中實(shí)現(xiàn)函數(shù)宏的三種方式

    在宏的第一個(gè)分號(hào)后便結(jié)束。即 a = b 和 b = tmp 均不受控制語句所作用。 因此,工程中,一般使用三種方式來對(duì)函數(shù)宏進(jìn)行封裝,分別為 {}、do{...}while(0
    發(fā)表于 12-29 07:34

    請(qǐng)問C語言中整形溢出的解決方法有哪些?

    C語言中整形溢出的解決方法有哪些?
    發(fā)表于 12-29 07:33

    單片機(jī)c語言中定義字節(jié)怎么定義?

    定義位可以用***it但是定義字節(jié)呢?還有就是比如匯編中的DPTR的DPH和DPLc語言中怎樣定義的呢?
    發(fā)表于 12-29 06:32

    請(qǐng)問C語言中整形溢出會(huì)產(chǎn)生哪些異常行為?

    C語言中整形溢出會(huì)產(chǎn)生哪些異常行為?
    發(fā)表于 12-26 07:05

    請(qǐng)問C語言中整形溢出對(duì)哪些應(yīng)用場(chǎng)景影響較大?

    C語言中整形溢出對(duì)哪些應(yīng)用場(chǎng)景影響較大
    發(fā)表于 12-24 08:24

    C語言C++的區(qū)別及聯(lián)系

    創(chuàng)建源文件時(shí)什么都不給,默認(rèn)是.cpp。 3、返回值 C語言中,如果一個(gè)函數(shù)沒有指定返回值類型,默認(rèn)返回int類型;C++中,如果一個(gè)函數(shù)
    發(fā)表于 12-24 07:23

    TypedefC語言中的應(yīng)用

    Typedef C語言中頻繁用以聲明一個(gè)已經(jīng)存在的數(shù)據(jù)類型的同義字。也可以用預(yù)處理器做類似的事。例如,思考一下下面的例子: #define dPS struct s * typedef
    發(fā)表于 12-22 13:53

    C語言中可以嵌套匯編語言嗎?

    請(qǐng)問C語言中可以嵌套匯編語言嗎?
    發(fā)表于 12-15 08:14

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

    內(nèi)聯(lián)函數(shù)禁用所有的編譯選項(xiàng)。使用__inline修飾函數(shù)導(dǎo)致函數(shù)調(diào)用處直接替換為函數(shù)體。這樣代
    發(fā)表于 12-12 07:08

    簡(jiǎn)單的內(nèi)聯(lián)匯編介紹

    這次主要學(xué)習(xí)了使用內(nèi)聯(lián)匯編完成一些較為簡(jiǎn)單的操作。我們思考接下來程序中插入跳轉(zhuǎn)指令來實(shí)現(xiàn)一些想要實(shí)現(xiàn)的操作以及對(duì)自行設(shè)計(jì)的硬件進(jìn)行操作。
    發(fā)表于 10-30 08:04

    通過內(nèi)聯(lián)匯編調(diào)用乘法指令mulh\\mulhsu\\mulhu

    mulh、mulhu與mulhsu指令,不能直接驗(yàn)證,需要其他方法。因此,我們想到了C語言中嵌入內(nèi)聯(lián)匯編,分別生成三條指令的接口函數(shù),之后
    發(fā)表于 10-24 06:52

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

    C編程中,內(nèi)聯(lián)函數(shù)和宏都用于避免函數(shù)調(diào)用的開銷并編寫可復(fù)用的邏輯部分,但它們工作方式和安全性
    的頭像 發(fā)表于 07-25 15:10 ?1808次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>的<b class='flag-5'>內(nèi)聯(lián)</b><b class='flag-5'>函數(shù)</b>與宏

    MSP430常用內(nèi)聯(lián)函數(shù)說明

    電子發(fā)燒友網(wǎng)站提供《MSP430常用內(nèi)聯(lián)函數(shù)說明.docx》資料免費(fèi)下載
    發(fā)表于 06-05 17:20 ?0次下載

    深入理解C語言C語言循環(huán)控制

    改變程序的執(zhí)行流程,使代碼更加靈活和可控。本文將詳細(xì)介紹這些語句的作用及其應(yīng)用場(chǎng)景,并通過示例代碼進(jìn)行說明。Part.1break語句C語言中break語句有兩種
    的頭像 發(fā)表于 04-29 18:49 ?1906次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>C</b><b class='flag-5'>語言</b>循環(huán)控制