在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

內聯函數定義 為什么需要內聯函數

嵌入式與Linux那些事 ? 來源:嵌入式與Linux那些事 ? 2024-02-19 12:20 ? 次閱讀

內聯函數定義

inline關鍵字是C99標準的型關鍵字,其作用是將函數展開,把函數的代碼復制到每一個調用處。這樣調用函數的過程就可以直接執行函數代碼,而不發生跳轉、壓棧等一般性函數操作。可以節省時間,也會提高程序的執行速度。

為什么需要內聯函數

C語言中,如果一些函數被頻繁的調用,不斷地用函數入棧,即函數棧,則會造成棧空間或者棧內存的大量消耗,為了解決這個問題,特別的引入了inline關鍵字,表示為內聯函數。

棧空間指的是函數內數據的內存空間,在一個系統下,棧空間的資源是有限的,假如頻繁大量的使用就會因棧空間的不足而導致出錯,函數的死循壞遞歸調用的最終結果就是導致棧內存空間的枯竭。

#include
//函數定義為inline即:內聯函數
inlinechar*dbtest(inta){
return(i%2>0)?"奇":"偶";
}

intmain()
{
inti=0;
for(i=1;i

上面的例子就是標準的內聯函數的用法,使用inline修飾帶來的好處我們表面看不出來,其實,在內部的工作就是在每個for循環的內部任何調用dbtest(i)的地方都換成了(i % 2 > 0) ? "奇" : "偶",這樣就避免了頻繁調用函數對棧內存重復開辟所帶來的消耗。

內聯函數注意事項

關鍵字inline必須與函數的定義體放在一起,才能使函數成為內聯函數,僅僅將inline放在函數聲明前面不起作用

如下風格的函數fun則成為內聯函數:

voidfun(intx,inty);
inlinevoidfun(intx,inty)//inline與函數的定義放在一起
{

}

關鍵字inline的使用是有所限制的

inline只適合函數體內代碼比較簡單的函數使用,不能包含復雜的結構控制語句,例如while、switch,并且內聯函數本身不能是直接遞歸函數(函數內部調用自己的函數)。

inline僅是一個對編譯器的建議

inline函數僅僅是一個對編譯器的建議,所以最后能否真正內聯,看編譯器的意思,它如果認為函數不復雜,能在調用點展開,就會真正內聯,并不是說聲明了內聯就會內聯,聲明內聯只是一個建議而已。

建議:inline函數的定義放在頭文件中

其次,因為內聯函數要在調用點展開,所以編譯器必須隨處可見內聯函數的定義,要不然就成了非內聯函數的調用了。所以,這要求每個調用了內聯函數的文件都出現了該內聯函數的定義

因此,將內聯函數的定義放在頭文件里實現是合適的,省卻你為每個文件實現一次的麻煩。

聲明跟定義要一致:如果在每個文件里都實現一次該內聯函數的話,那么,最好保證每個定義都是一樣的,否則,將會引起未定義的行為。如果不是每個文件里的定義都一樣,那么,編譯器展開的是哪一個,那要看具體的編譯器而定。所以,最好將內聯函數定義放在頭文件中。

static和inline聯合使用

static是靜態修飾符,由其關鍵字修飾的變量會保存到全局數據區,對于普通的局部變量或者全局變量,都是由系統自動分配內存的,并且當變量離開作用域的時候釋放掉,而使用static關鍵字來修飾,只有當程序結束時候才會釋放掉,使用static inline修飾時,函數僅在文件內部可見,不會污染命名空間,另外,函數在運行過程中也會分配內存空間,但是由于static的存在,就和修飾變量類似,它只會開辟一塊內存空間。

內聯函數優缺點

普通函數在調用過程中,會對寄存器中內容進行上下文切換(push和pop操作),而內聯函數則不需要,所以普通函數相比內聯函數,耗時要多一些

當函數使用次數比較多的時候,內聯函數在每個調用的地方都會被展開,所以導致固件大小會變大,同一段代碼會多次重復出現在固件中。而普通函數則沒有此問題,不管調用的函數的次數多少,函數在固件中均只占用一處,空間利用率較高。inline函數其實就是空間換時間

inline 和宏的區別

雖然inline函數和帶參數的宏很像,但是在使用方法上和宏還是有很大區別的:

inline()函數 帶參數的宏
展開的時機 在編譯的時候展開,因此inline關鍵字是一個編譯關鍵字 在預處理時展開,因此#define關鍵字是一個預處理關鍵字
參數類型檢查 inline()函數是一中函數,會進行嚴格的參數類型檢查 不會檢查參數類型,只是做簡單的字符串替換,因此在使用帶參數的宏時會有一些副作用,編寫程序是要人為預防
是否允許有復雜語句 不允許出現復雜語句,如果出現復雜語句,該函數將不會展開,例如遞歸,大型循環等 對此不做要求。宏只是做字符串替換操作,而不了解語句的含義
是否一定被展開 不一定,是否展開由編譯器決定 一定,只要使用了宏就可以保證被展開
接口封裝
是否支持調試

總結

內聯函數相比宏函數,會進行語法檢查。宏函數是在預處理階段生效,內聯函數是在編譯階段進行語法檢查然后替換。

內聯函數相比普通函數,少了上下文切換的步驟所以執行會更快一些。

內聯函數被多次調用,會使固件大小膨脹,內聯函數的高速是以空間來換時間。

內聯函數不可遞歸。

如果函數內容太過于復雜,編譯器會忽略inline關鍵字,把他當成普通函數來處理。





審核編輯:劉清

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

    關注

    180

    文章

    7630

    瀏覽量

    140688
  • 編譯器
    +關注

    關注

    1

    文章

    1657

    瀏覽量

    49960

原文標題:【C語言】內聯函數總結

文章出處:【微信號:嵌入式與Linux那些事,微信公眾號:嵌入式與Linux那些事】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    RealView MDK中使用內聯函數需要注意的問題

    的文件中申明為extern類型。原因是MDK中使用的__inline函數時和標準C++中的inline函數有相同的語義。在C++標準中,一個內聯函數在用到它的每個解釋單元
    發表于 08-02 10:10

    內聯函數簡介

    1.內聯函數在C++中我們通常定義以下函數來求兩個整數的最大值:復制代碼 代碼如下:int max(int a, int b){return a > b ? a : b;}為這么一個小
    發表于 09-11 16:22

    基于SUIF的函數內聯技術

    從基于調用圖的函數內聯技術、函數參數的映射技術和內聯使用的不同策略3 個方面討論基于SUIF 系統的內聯技術的實現。根據KAP 系統需求,提
    發表于 03-28 09:50 ?6次下載

    C++如何處理內聯函數

    當一個函數內聯和虛函數時,會發生代碼替換或使用虛表調用嗎? 為了弄 清楚內聯和虛函數,讓我們將它們分開來考慮。通常,一個
    發表于 11-29 11:59 ?28次下載

    內聯函數詳解

    什么是內聯性和外聯函數 類的成員函數可以分為內聯函數和外聯函數
    發表于 11-02 14:05 ?0次下載

    內聯函數和外聯函數有什么區別

    內聯函數是指用inline關鍵字修飾的函數。在類內定義函數被默認成內聯
    發表于 12-15 11:52 ?6175次閱讀
    <b class='flag-5'>內聯</b><b class='flag-5'>函數</b>和外聯<b class='flag-5'>函數</b>有什么區別

    Java之內聯函數_內聯函數的優缺點

    內聯函數就是指函數在被調用的地方直接展開,編譯器在調用時不用像一般函數那樣,參數壓棧,返回時參數出棧以及資源釋放等,這樣提高了程序執行速度。Java語言中有一個關鍵字final來指明那
    發表于 12-15 15:00 ?3399次閱讀

    C++基礎語法之inline 內聯函數

    函數處; 相當于不用執行進入函數的步驟,直接執行函數體; 相當于宏,卻比宏多了類型檢查,真正具有函數特性; 編譯器一般不內聯包含循環、遞歸、
    的頭像 發表于 09-09 09:38 ?2342次閱讀

    C++語法中的inline內聯函數詳解

    函數處; 相當于不用執行進入函數的步驟,直接執行函數體; 相當于宏,卻比宏多了類型檢查,真正具有函數特性; 編譯器一般不內聯包含循環、遞歸、
    的頭像 發表于 09-09 09:33 ?3573次閱讀

    C語言-內聯函數、遞歸函數、指針函數

    這篇文章介紹C語言的內聯函數、遞歸函數函數指針、指針函數、局部地址、const關鍵字、extern關鍵字等知識點;這些知識點在實際項目開發
    的頭像 發表于 08-14 10:03 ?1943次閱讀

    講解下C語言的內聯函數

    內聯函數是C語言從C++中借鑒過來的,適當的使用內聯函數可以提高程序的執行效率。
    的頭像 發表于 02-16 09:15 ?1755次閱讀

    C語言內聯函數,提升C技巧必備

    內聯函數是C語言從C++中借鑒過來的,適當的使用內聯函數可以提高程序的執行效率。本篇文章就來講解下內聯
    的頭像 發表于 02-16 09:16 ?980次閱讀

    C語言內聯函數

    函數B很小,又被頻繁的調用,可能函數調用的切換時間比函數內代碼的執行時間還長,這樣明顯劃不來,那么我們就可以將這個函數聲明為內聯(加上 in
    的頭像 發表于 02-21 16:55 ?1256次閱讀
    C語言<b class='flag-5'>內聯</b><b class='flag-5'>函數</b>

    宏的缺陷與內聯函數的引入

    。 所以為了解決這種不利于調試的問題,就有了內聯函數。 那么什么是內聯函數呢? 我們以inline修飾的函數叫做
    的頭像 發表于 11-01 17:57 ?635次閱讀

    MSP430常用內聯函數說明

    電子發燒友網站提供《MSP430常用內聯函數說明.docx》資料免費下載
    發表于 06-05 17:20 ?0次下載
    主站蜘蛛池模板: 午夜精品久久久久久久四虎 | 天天拍天天操 | 六月丁香深爱六月综合激情 | 六月婷婷精品视频在线观看 | 午夜黄色大片 | 亚洲精品久久久久影 | 夜夜春宵翁熄性放纵30 | 特黄大片aaaaa毛片 | 婷婷99视频精品全部在线观看 | 亚洲怡红院在线 | 日本三浦理惠子中文字幕 | 国产九九热 | 天堂看动漫 | a视频免费看 | 天天射天天拍 | 久久综合色视频 | 久久综合久色欧美婷婷 | 88xx成人永久免费观看 | 国产农村妇女毛片精品久久久 | 国产精品成人一区二区三区 | 黄床大片| 欧美日韩高清一本大道免费 | 高清不卡一区 | 色屁屁www免费看视频影院 | 在线a免费 | 日韩特级 | 美女视频黄色的免费 | 日本国产在线观看 | www.亚洲欧美 | 日本系列 1页 亚洲系列 | 国产一级片免费 | 欧美18同性gay视频 | 特色毛片 | 99热精品久久只有精品30 | 国产资源网站 | 精品亚洲成a人片在线观看 精品亚洲大全 | 色综合久久88色综合天天 | 久久久久久国产精品免费免费 | 羞羞色院91精品网站 | 狠狠五月深爱婷婷网 | 午夜在线一区 |