一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

Class MyClass

{

private:

int m_iState;

}

按照面向對象的思想,函數(shù)的屬性應盡量的私有化,但外部怎么獲得這個屬性值呢?一般的方法就是加一個共有函數(shù),這就實現(xiàn)的面向對象思想中所謂“通過公用接口操作對象的私有屬性”。于是就變成了:

Class MyClass

{

public:

int GetState();

private:

int m_iState;

}

int MyClass::GetState()

{

return m_iState;

}

這樣一來,面向對象思想倒是體現(xiàn)出來了,但你的CPU會恨你:“你丫一個鳥函數(shù)就返回一個整數(shù)卻讓老子進一次棧、彈一次棧”,內存也會埋怨:“兄弟也得跟著分配內存!”

但對你來說,也很委屈,怎么辦,把所有的屬性都改成public?讓外部內碼直接訪問?況且,那樣也不解決所有問題,因為有時候即使不是為了面向對象,我們也需要把獨立的功能模塊做成函數(shù),比如說產生隨機數(shù)的函數(shù)。我想

int iRand=rand();

總比:

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

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

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

Class MyClass

{

public:

inline int GetState();

private:

int m_iState;

}

int inline MyClass::GetState()

{

return m_iState;

}

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

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

Class MyClass

{

public:

int GetState(){ return m_iState; }

private:

int m_iState;

}

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

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

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

[cpp] view plain copyvoid myprintf(int a)

{

priintf(“%d”,a);

}

int main()

{

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

myprintf(3);

}

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

[cpp] view plain copyint main()

{

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

void myprintf(3)

{

printf(“%d”,3);

}

return 0;

}

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

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

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

inline int add(int x, int y)

{

return x+y;

}

int main()

{

int i,j,k;

printf(“請輸入兩個整數(shù)的值:”);

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

k=add(i,j);

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

return 0;

}


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴

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

文章出處:【微信號:mcuworld,微信公眾號:嵌入式資訊精選】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

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

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

    ?VLM(視覺語言模型)?詳細解析

    詳細解析: 1. 核心組成與工作原理 視覺編碼器 :提取圖像特征,常用CNN(如ResNet)或視覺Transformer(ViT)。 語言模型 :處理文本輸入/輸出,如GPT、BERT等,部分模型
    的頭像 發(fā)表于 03-17 15:32 ?4001次閱讀
    ?VLM(視覺<b class='flag-5'>語言</b>模型)?<b class='flag-5'>詳細</b><b class='flag-5'>解析</b>

    EE-32:語言擴展:內存存儲類型、ASM和內聯(lián)構造

    電子發(fā)燒友網站提供《EE-32:語言擴展:內存存儲類型、ASM和內聯(lián)構造.pdf》資料免費下載
    發(fā)表于 01-14 15:03 ?0次下載
    EE-32:<b class='flag-5'>語言</b>擴展:內存存儲類型、ASM和<b class='flag-5'>內聯(lián)</b>構造

    EE-62:C語言中訪問短字內存

    電子發(fā)燒友網站提供《EE-62:C語言中訪問短字內存.pdf》資料免費下載
    發(fā)表于 01-07 14:02 ?0次下載
    EE-62:<b class='flag-5'>在</b><b class='flag-5'>C</b><b class='flag-5'>語言中</b>訪問短字內存

    EE-128:C語言中的DSP:從C調用匯編類成員函數(shù)

    電子發(fā)燒友網站提供《EE-128:C語言中的DSP:從C調用匯編類成員函數(shù).pdf》資料免費下載
    發(fā)表于 01-07 13:48 ?0次下載
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的DSP:從<b class='flag-5'>C</b>調用匯編類成員<b class='flag-5'>函數(shù)</b>

    同樣是函數(shù),CC++中有什么區(qū)別

    同樣是函數(shù), CC++ 中有什么區(qū)別? 第一個返回值。 C語言
    的頭像 發(fā)表于 11-29 10:25 ?898次閱讀

    C語言中申請的堆內存能不能自動釋放

    C語言中申請的堆內存能不能自動釋放?每次都要手動 free 太麻煩,也容易忘記。 學過 C++ 的同學,應該首先能想到智能指針。 但是這是C語言
    的頭像 發(fā)表于 11-27 09:33 ?508次閱讀

    C語言中的頭文件能不能重復包含

    C語言中的頭文件能不能重復包含? 比如代碼寫成這樣,stdio.h 連續(xù)包含了兩次。 #include #include int main(){ printf("helloworld
    的頭像 發(fā)表于 11-26 17:19 ?593次閱讀

    使用C語言實現(xiàn)函數(shù)模板

      用C語言能不能實現(xiàn)一個通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?942次閱讀

    C語言中的socket編程基礎

    數(shù)據(jù) 步驟6:關閉socket 創(chuàng)建socket C語言中,創(chuàng)建socket需要使用socket()函數(shù)。這個函數(shù)需要兩個參數(shù):域
    的頭像 發(fā)表于 11-01 16:51 ?1210次閱讀

    技術干貨驛站 ▏深入理解C語言:編程高手必備,全方位解析運算符的核心技能!

    過程中發(fā)揮著重要作用,還對程序的性能和穩(wěn)定性產生直接影響。繼上一期對C語言常量的深入分析后,本文將進一步探討C語言中的常用運算符,
    的頭像 發(fā)表于 09-18 15:56 ?760次閱讀
    技術干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:編程高手必備,全方位<b class='flag-5'>解析</b>運算符的核心技能!

    C語言指針詳細解析

    可以對數(shù)據(jù)本身,也可以對存儲數(shù)據(jù)的變量地址進行操作。 指針是一個占據(jù)存儲空間的實體在這一段空間起始位置的相對距離值。C/C++語言中,指針一般被認為是指針變量,指針變量的內容存儲的是
    發(fā)表于 09-14 10:03

    c語言中從左到右結合怎么看

    C語言中,操作符的結合性(Associativity)是指當操作符表達式中連續(xù)出現(xiàn)時,它們如何與操作數(shù)結合的順序。對于大多數(shù)二元操作符(即需要兩個操作數(shù)的操作符),
    的頭像 發(fā)表于 08-20 11:42 ?1655次閱讀

    技術干貨驛站 ▏深入理解C語言:基本數(shù)據(jù)類型和變量

    語言的知識,為后續(xù)的編程學習打下堅實的基礎。1基本數(shù)據(jù)類型C語言中,數(shù)據(jù)類型指的是用于聲明不同類型的變量或函數(shù)的一個廣泛的系統(tǒng),用于定義變
    的頭像 發(fā)表于 07-26 17:53 ?2746次閱讀
    技術干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:基本數(shù)據(jù)類型和變量