亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++編程中隊內聯函數的理解和使用

2020-05-23 14:09:57
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++編程中隊內聯函數的理解和使用,簡單舉例講解了inline關鍵字引出的內聯函數的相關知識,需要的朋友可以參考下
 

函數調用過程
c++經過編譯生成可執行程序文件exe,存放在外存儲器中。程序啟動,系統從外存儲器中將可執行文件裝載到內存中,從入口地址(main函數起始處)開始執行。程序執行中遇到了對其他函數的調用,就暫停當前函數的執行,并保存下一條指令的地址作為從被調函數返回后繼續執行的入口點,保存現場。然后轉到被調函數的入口地址執行被調函數。遇到return語句或者被調函數結束后,恢復先前保存的現場,從先前保存的返回地址處繼續執行主調函數的其余部分。

內聯函數
函數調用需要進行現場保護,以便在函數調用之后繼續進行。函數調用后還需要恢復現場才能繼續執行。這都需要系統開銷,影響了程序的效率。

內聯函數在編譯的時候將所調用的函數代碼直接嵌入到主調函數中,定義方式就是在普通的函數定義前面加上inline,不存在程序流程跳轉和返回,但是增加了程序代碼。內聯函數函數體不能含有復雜的結構控制語句,適用于1-5行的小函數。當函數規模比較大的時候,函數運行的時間相對與函數的調用和返回時間大很多,綜合時間和空間考慮,用內聯沒有太大意義。

原理:
對于任何內聯函數,編譯器在符號表里放入函數的聲明(包括名字、參數類型、返回值類型)。如果編譯器沒有發現內聯函數存在錯誤,那么該函數的代碼也被放入符號表里。在調用一個內聯函數時,編譯器首先檢查調用是否正確(進行類型安全檢查,或者進行自動類型轉換,當然對所有的函數都一樣)。如果正確,內聯函數的代碼就會直接替換函數調用,于是省去了函數調用的開銷。

內聯函數與宏的區別
1.內聯函數在運行時可調試,而宏定義不可以;

2.編譯器會對內聯函數的參數類型做安全檢查或自動類型轉換(同普通函數),而宏定義則不會;

3.內聯函數可以訪問類的成員變量,宏定義則不能;

4.在類中聲明同時定義的成員函數,自動轉化為內聯函數。

 

C++ 語言的函數內聯機制既具備宏代碼的效率,又增加了安全性,而且可以自由操作類的數據成員。所以在C++ 程序中,應該用內聯函數取代所有宏代碼

一個可執行文件的cpp文件中一個函數只能被定義一次。如果你把函數定義在一個.h文件中并讓兩個cpp包含就會造成這個函數分別在兩個cpp中被定義產生錯誤。但是inline函數是允許在多個cpp中多次定義的,就解決了這個問題。

for (int i=v.begin() ; i<v.size() ; i++) {   .... } 

       對于size()的調用,其實是內聯。在循環時,可以采用變量保存v.size()的值,以減少每個循環的調用開支。于是決定一搜,順便總結之。

1、inline的引出

考慮下列min()函數

int min( int v1, int v2 ) {   return( v1 < v2 << v1 : v2 ); } 

      為這樣的小操作定義一個函數的好處是:
     a.如果一段代碼包含min()的調用,那閱讀這樣的代碼并解釋其含義比讀一個條件操作符的實例,可讀性會強很多。

     b.改變一個局部化的實現比更改一個應用中的300個出現要容易得多

     c.語義是統一的,每個測試都能保證相同的方式實現

     d.函數可以被重用,不必為其他的應用重寫代碼

     不過,將min()寫成函數有一個嚴重的缺點:調用函數比直接計算條件操作符要慢很多。那怎么能兼顧以上優點和效率呢?C++提供的解決方案為inline(內聯)函數

2、inline的原理:代碼替代

       在程序編譯時,編譯器將程序中出現的內聯函數的調用表達式用內聯函數的函數體來進行替代。

       例如,如果一個函數被指定為inline 函數則它將在程序中每個調用點上被內聯地展開例如

int minVal2 = min( i, j ); 

在編譯時被展開為

int minVal2 = i < j << i : j; 

 則把min()寫成函數的額外執行開銷從而被消除了。
3、inline的使用

       讓一個函數成為內聯函數,隱式的為在類里定義函數,顯式的則是在函數前加上inline關鍵字說明。

4、使用inline的一些注意事項

      a.從inline的原理,我們可以看出,inline的原理,是用空間換取時間的做法,是以代碼膨脹(復制)為代價,僅僅省去了函數調用的開銷,從而提高函數的執行效率。如果執行函數體內代碼的時間,相比于函數調用的開銷較大,那么效率的收獲會很少。所以,如果函數體代碼過長或者函數體重有循環語句,if語句或switch語句或遞歸時,不宜用內聯

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

inline void Foo(int x, int y); // inline 僅與函數聲明放在一起 void Foo(int x, int y) {   ... } 

以上代碼不能成為內聯函數,而以下則可以

void Foo(int x, int y); inline void Foo(int x, int y) // inline 與函數定義體放在一起 {   ... } 

       所以說,inline 是一種“用于實現的關鍵字”,而不是一種“用于聲明的關鍵字”。對于以上例子,林銳還建議,只在定義前加上inline,而不是在聲明和定義前都加,因為這能體現高質量C++/C 程序設計風格的一個基本原則:聲明與定義不可混為一談。
       c.inline對于編譯器來說只是一個建議,編譯器可以選擇忽略該建議。換句話說,哪怕真的寫成了inline,也沒有任何錯誤的情況下,編譯器會自動進行優化。所以當inline中出現了遞歸,循環,或過多代碼時,編譯器自動無視inline聲明,同樣作為普通函數調用。


總結下:

       覺得可以將內聯理解為C++中對于函數專有的宏,對于C的函數宏的一種改進。對于常量宏,C++提供const替代;而對于函數宏,C++提供的方案則是inline。在C中,大家都知道宏的優勢,編譯器通過復制宏代碼的方式,省去了參數壓棧,生成匯編的call調用,返回參數等操作,雖然存在一些安全隱患,但在效率上,還是很可取的。
       不過函數宏還是有不少缺陷的,主要有以下:

       a.在復制代碼時,容易出現一想不到的邊際效應,比如經典的

#define MAX(a, b) (a) > (b) ? (a) : (b) 

在執行語句:

result = MAX(i, j) + 2 ; 

時,會被解釋為

result = (i) > (j) ? (i) : (j) + 2 ; 

     b.使用宏,無法進行調試,雖然windows提供了ASSERT宏
     c.使用宏,無法訪問類的私有成員
      所以,C++ 通過內聯機制,既具備宏代碼的效率,又增加了安全性,還可以自由操作類的數據成員,算是一個比較完美的解決方案。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久99青青精品免费观看| 久久天天躁夜夜躁狠狠躁2022| 久久精品国产久精国产思思| 777精品视频| 亚洲欧美在线看| 久久精品中文字幕| 久久久精品一区| 久久中国妇女中文字幕| 日韩欧美有码在线| 成人深夜直播免费观看| 亚洲成色777777在线观看影院| 日韩中文字幕第一页| 亚洲福利视频专区| 日韩中文字幕视频| 亚洲欧美日韩第一区| 亚洲欧美日韩高清| 亚洲精品720p| 成人做爰www免费看视频网站| 精品久久久久久国产91| 欧美亚洲国产日本| 久久综合久久美利坚合众国| 97香蕉久久夜色精品国产| 欧美成人小视频| 国产亚洲欧美aaaa| 精品亚洲精品福利线在观看| 日韩va亚洲va欧洲va国产| 国产精品视频地址| 精品视频www| 欧美成人午夜免费视在线看片| 欧美麻豆久久久久久中文| 久久精品视频在线播放| 2019最新中文字幕| 国产精品免费电影| 国产精品久久久久aaaa九色| 精品久久久久久久久久| 久久影院免费观看| 日韩欧美中文免费| 国产精品国语对白| 日韩在线国产精品| 久久精视频免费在线久久完整在线看| 欧美另类老女人| 中文字幕精品视频| 国产精品永久免费观看| 中文字幕国产亚洲2019| 日韩精品在线观看一区| 国产日韩欧美在线看| 国内精品伊人久久| 久久九九国产精品怡红院| 97**国产露脸精品国产| 欧美在线激情网| 国产日韩欧美影视| 一本一道久久a久久精品逆3p| 日韩三级影视基地| 国产精品视频免费观看www| 国内揄拍国内精品| 日韩av影片在线观看| 欧美精品video| 8x海外华人永久免费日韩内陆视频| 国产精品高清免费在线观看| 中文字幕亚洲色图| 亚洲欧美日韩中文视频| 亚洲区bt下载| 伊人久久五月天| 欧美激情免费看| 91系列在线播放| 精品久久国产精品| 日韩av免费网站| 91手机视频在线观看| 麻豆国产精品va在线观看不卡| 久久精品人人爽| 国产一区二区日韩| 蜜臀久久99精品久久久无需会员| 九九热这里只有精品6| 日韩有码片在线观看| 久久久亚洲国产天美传媒修理工| 精品久久久国产精品999| 欧美日韩亚洲激情| 亚洲精品国精品久久99热一| 日韩中文字幕国产| 国语自产精品视频在线看| 亚洲精品久久久久久久久久久| 日韩av网站大全| 国产精品96久久久久久| 欧美丰满片xxx777| 亚洲欧美日韩另类| 亚洲影院色无极综合| 久久91亚洲人成电影网站| 欧美极品第一页| 久久久999国产精品| 久久91亚洲精品中文字幕奶水| 欧美裸体男粗大视频在线观看| 亚洲aaaaaa| 美女久久久久久久| 欧美电影第一页| 欧美性20hd另类| 日韩欧中文字幕| 欧美国产第一页| 欧美中文在线字幕| 日韩高清不卡av| 亚洲一区二区三区xxx视频| 国产视频久久久久| 中文字幕国产日韩| 亚洲一区二区精品| 亚洲欧美日韩一区二区在线| 九色精品美女在线| 88国产精品欧美一区二区三区| 欧美麻豆久久久久久中文| 97成人超碰免| 色先锋久久影院av| 亚洲无线码在线一区观看| 国产精品青草久久久久福利99| 成人免费网站在线| 欧美在线一级视频| 久久成人综合视频| 欧美亚洲伦理www| 欧美成人激情图片网| 久久精品小视频| 欧美贵妇videos办公室| 国产精品美女无圣光视频| 91伊人影院在线播放| 亚洲国产精品小视频| 亚洲第一综合天堂另类专| 久久久最新网址| 蜜臀久久99精品久久久无需会员| 91成人国产在线观看| 国产成人免费91av在线| 日韩美女写真福利在线观看| 欧美在线视频播放| www.亚洲一二| 亚洲福利视频二区| 亚洲欧美在线x视频| 国产精品黄色影片导航在线观看| 欧美日韩中文字幕在线视频| 久久亚洲精品毛片| 欧美性黄网官网| 久久久久久久久久久免费精品| 欧美日韩亚洲视频| 91亚洲永久免费精品| 1769国内精品视频在线播放| 亚洲a∨日韩av高清在线观看| 亚洲天天在线日亚洲洲精| 久久久国产在线视频| 国产亚洲美女精品久久久| 国产亚洲xxx| 色狠狠av一区二区三区香蕉蜜桃| 成人乱人伦精品视频在线观看| 欧美成人免费播放| 91免费看国产| 亚洲精品福利在线| 久久久www成人免费精品张筱雨| 欧美成人精品xxx| 丝袜美腿精品国产二区| 欧美黑人一区二区三区| 亚洲www永久成人夜色| 国外成人在线播放| 91av中文字幕| 国产97人人超碰caoprom| 国产ts一区二区| 尤物九九久久国产精品的分类| 久久精品99久久久久久久久| 国产福利精品视频| 亚洲人免费视频| 亚洲美女av在线| 国产精品免费视频xxxx|