国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

詳細解析內聯函數以及在C語言中的作用

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

掃碼添加小助手

加入工程師交流群

內聯函數的作用

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

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

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

Class MyClass

{

private:

int m_iState;

}

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

Class MyClass

{

public:

int GetState();

private:

int m_iState;

}

int MyClass::GetState()

{

return m_iState;

}

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

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

int iRand=rand();

總比:

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

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

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

Class MyClass

{

public:

inline int GetState();

private:

int m_iState;

}

int inline MyClass::GetState()

{

return m_iState;

}

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

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

Class MyClass

{

public:

int GetState(){ return m_iState; }

private:

int m_iState;

}

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

C語言的內聯函數的作用

[cpp] view plain copy關內聯函數鍵字inline

[cpp] view plain copyvoid myprintf(int a)

{

priintf(“%d”,a);

}

int main()

{

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

myprintf(3);

}

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

[cpp] view plain copyint main()

{

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

void myprintf(3)

{

printf(“%d”,3);

}

return 0;

}

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

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

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

inline int add(int x, int y)

{

return x+y;

}

int main()

{

int i,j,k;

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

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

k=add(i,j);

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

return 0;

}


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

    關注

    183

    文章

    7644

    瀏覽量

    145569
  • 內聯函數
    +關注

    關注

    0

    文章

    10

    瀏覽量

    2447

原文標題:內聯函數在C語言中的作用

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C語言回調函數原來這么簡單

    了解開發語言的朋友應該都會對回調函數有所了解,很多的程序開發語言中都能看到回調的身影。很多場景下,當某個條件成立以后我們**代碼執行某些指定的部分,這個時候可以考慮使用回調
    發表于 12-30 06:45

    C語言中實現函數宏的三種方式

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

    請問C語言中整形溢出的解決方法有哪些?

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

    單片機c語言中定義字節怎么定義?

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

    請問C語言中整形溢出會產生哪些異常行為?

    C語言中整形溢出會產生哪些異常行為?
    發表于 12-26 07:05

    請問C語言中整形溢出對哪些應用場景影響較大?

    C語言中整形溢出對哪些應用場景影響較大
    發表于 12-24 08:24

    C語言C++的區別及聯系

    創建源文件時什么都不給,默認是.cpp。 3、返回值 C語言中,如果一個函數沒有指定返回值類型,默認返回int類型;C++中,如果一個函數
    發表于 12-24 07:23

    TypedefC語言中的應用

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

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

    請問C語言中可以嵌套匯編語言嗎?
    發表于 12-15 08:14

    內聯函數介紹

    內聯函數禁用所有的編譯選項。使用__inline修飾函數導致函數調用處直接替換為函數體。這樣代
    發表于 12-12 07:08

    簡單的內聯匯編介紹

    這次主要學習了使用內聯匯編完成一些較為簡單的操作。我們思考接下來程序中插入跳轉指令來實現一些想要實現的操作以及對自行設計的硬件進行操作。
    發表于 10-30 08:04

    通過內聯匯編調用乘法指令mulh\\mulhsu\\mulhu

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

    C語言中內聯函數與宏

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

    MSP430常用內聯函數說明

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

    深入理解C語言C語言循環控制

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