青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

醬壇子

專注C++技術 在這里寫下自己的學習心得 感悟 和大家討論 共同進步(歡迎批評!!!)

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

公告

王一偉 湖南商學院畢業 電子信息工程專業

常用鏈接

留言簿(19)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 389620
  • 排名 - 64

最新隨筆

最新評論

閱讀排行榜

評論排行榜

自己對 inline 函數做個總結

(一)inline函數(摘自C++ Primer的第三版)

?????????在函數聲明或定義中函數返回類型前加上關鍵字inline即把min()指定為內聯。

?? inline int min(int first, int secend) {/****/};

??????inline函數對編譯器而言必須是可見的,以便它能夠在調用點內展開該函數。與非inline函數不同的是,inline函數必須在調用該函數的每個文本文件中定義。當然,對于同一程序的不同文件,如果inline函數出現的話,其定義必須相同。對于由兩個文件compute.C和draw.C構成的程序來說,程序員不能定義這樣的min()函數,它在compute.C中指一件事情,而在draw.C中指另外一件事情。如果兩個定義不相同,程序將會有未定義的行為:

??????為保證不會發生這樣的事情,建議把inline函數的定義放到頭文件中。在每個調用該inline函數的文件中包含該頭文件。這種方法保證對每個inline函數只有一個定義,且程序員無需復制代碼,并且不可能在程序的生命期中引起無意的不匹配的事情。

(二)內聯函數的編程風格(摘自高質量C++/C 編程指南)

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

如下風格的函數Foo 不能成為內聯函數:inline void Foo(int x, int y); // inline 僅與函數聲明放在一起void Foo(int x, int y){}而如下風格的函數Foo 則成為內聯函數:void Foo(int x, int y);inline void Foo(int x, int y) // inline 與函數定義體放在一起{}所以說,inline 是一種“用于實現的關鍵字”,而不是一種“用于聲明的關鍵字”。一般地,用戶可以閱讀函數的聲明,但是看不到函數的定義。盡管在大多數教科書中內聯函數的聲明、定義體前面都加了inline 關鍵字,但我認為inline 不應該出現在函數的聲明中。這個細節雖然不會影響函數的功能,但是體現了高質量C++/C 程序設計風格的一個基本原則:聲明與定義不可混為一談,用戶沒有必要、也不應該知道函數是否需要內聯。

定義在類聲明之中的成員函數將自動地成為內聯函數,例如class A{public:void Foo(int x, int y) {? } // 自動地成為內聯函數}將成員函數的定義體放在類聲明之中雖然能帶來書寫上的方便,但不是一種良好的編程風格,上例應該改成:// 頭文件class A{public:void Foo(int x, int y);}// 定義文件inline void A::Foo(int x, int y){}?慎用內聯內聯能提高函數的執行效率,為什么不把所有的函數都定義成內聯函數?如果所有的函數都是內聯函數,還用得著“內聯”這個關鍵字嗎?內聯是以代碼膨脹(復制)為代價,僅僅省去了函數調用的開銷,從而提高函數的執行效率。如果執行函數體內代碼的時間,相比于函數調用的開銷較大,那么效率的收獲會很少。另一方面,每一處內聯函數的調用都要復制代碼,將使程序的總代碼量增大,消耗更多的內存空間。以下情況不宜使用內聯:(1)如果函數體內的代碼比較長,使用內聯將導致內存消耗代價較高。(2)如果函數體內出現循環,那么執行函數體內代碼的時間要比函數調用的開銷大。類的構造函數和析構函數容易讓人誤解成使用內聯更有效。要當心構造函數和析構函數可能會隱藏一些行為,如“偷偷地”執行了基類或成員對象的構造函數和析構函數。所以不要隨便地將構造函數和析構函數的定義體放在類聲明中。一個好的編譯器將會根據函數的定義體,自動地取消不值得的內聯(這進一步說明了inline 不應該出現在函數的聲明中)。


注意點:

內聯函數既能夠去除函數調用所帶來的效率負擔又能夠保留一般函數的優點。然而,內聯函數并不是萬能藥, ?
? 在一些情況下,它甚至能夠降低程序的性能。因此在使用的時候應該慎重。 ?
? ? ? ? ? 1.我們先來看看內聯函數給我們帶來的好處:從一個用戶的角度來看,內聯函數看起來和普通函數一樣, ?
? 它可以有參數和返回值,也可以有自己的作用域,然而它卻不會引入一般函數調用所帶來的負擔。另外, ?
? 它可以比宏更安全更容易調試。 ?
? ? 當然有一點應該意識到,inline ? specifier僅僅是對編譯器的建議,編譯器有權利忽略這個建議。那么編譯器是 ?
? ? 如何決定函數內聯與否呢?一般情況下關鍵性因素包括函數體的大小,是否有局部對象被聲明,函數的復雜性等等。 ?
? ? ? ? ? 2.那么如果一個函數被聲明為inline但是卻沒有被內聯將會發生什么呢?理論上,當編譯器拒絕內聯一個 ?
? 函數的時候,那個函數會像普通函數一樣被對待,但是還會出現一些其他的問題。例如下面這段代碼: ?
? // ? filename ? Time.h ?
? #include<ctime> ?
? #include<iostream> ?
? using ? namespace ? std; ?
? class ? Time ?
? { ?
? public: ?
? ? ? ? ? inline ? void ? Show() ? { ? for ? (int ? i ? = ? 0; ? i<10; ? i++) ? cout<<time(0)<<endl;} ?
? }; ?
? ? ? ? ? 因為成員函數Time::Show()包括一個局部變量和一個for循環,所以編譯器一般拒絕inline,并且把它當作一個普通的成員函數。但是這個包含類聲明的頭文件會被單獨的#include進各個獨立的編譯單元中: ?
? ? ? ? ? // ? filename ? f1.cpp ?
? #include ? "Time.hj" ?
? void ? f1() ?
? { ?
? ? ? ? ? Time ? t1; ?
? ? ? ? ? t1.Show(); ?
? } ?
? ?
? // ? filename ? f2.cpp ?
? #include ? "Time.h" ?
? void ? f2() ?
? { ?
? ? ? ? ? Time ? t2; ?
? ? ? ? ? t2.Show(); ?
? } ?
? 結果編譯器為這個程序生成了兩個相同成員函數的拷貝: ?
? void ? f1(); ?
? void ? f2(); ?
? int ? main() ?
? { ?
? ? ? ? ? f1(); ? ?
? ? ? ? ? f2(); ?
? ? ? return ? 0; ?
? } ?
? ?
? 當程序被鏈接的時候,linker將會面對兩個相同的Time::Show()拷貝,于是函數重 ?
? 定義的連接錯誤發生。但是老一些的C++實現對付這種情況的辦法是通過把一個 ?
? un-inlined函數當作static來處理。因此每一份函數拷貝僅僅在自己的編譯單元中 ?
? 可見,這樣鏈接錯誤就解決了,但是在程序中卻會留下多份函數拷貝。在這種情況 ?
? 下,程序的性能不但沒有提升,反而增加了編譯和鏈接時間以及最終可執行體的大小。 ?
? 但是幸運的是,新的C++標準中關于un-inlined函數的說法已經改變。一個符合標準 ?
? C++實現應該只生成一份函數拷貝。然而,要想所有的編譯器都支持這一點可能還 ?
? 需要很長時間。 ?
? 另外關于內聯函數還有兩個更令人頭疼的問題。第一個問題是該如何進行維護。 ?
? 一個函數開始的時候可能以內聯的形式出現,但是隨著系統的擴展,函數體可能要 ?
? 求添加額外的功能,結果內聯函數就變得不太可能,因此需要把inline ? specifier ?
? 去除以及把函數體放到一個單獨的源文件中。另一個問題是當內聯函數被應用在代 ?
? 碼庫的時候產生。當內聯函數改變的時候,用戶必須重新編譯他們的代碼以反映這 ?
? 種改變。然而對于一個非內聯函數,用戶僅僅需要重新鏈接就可以了。 ?
? 這里想要說的是,內聯函數并不是一個增強性能的靈丹妙藥。只有當函數非常短小 ?
? 的時候它才能得到我們想要的效果,但是如果函數并不是很短而且在很多地方都被 ?
? 調用的話,那么將會使得可執行體的體積增大。最令人煩惱的還是當編譯器拒絕內聯 ?
? 的時候。在老的實現中,結果很不盡人意,雖然在新的實現中有很大的改善,但是 ?
? 仍然還是不那么完善的。一些編譯器能夠足夠的聰明來指出哪些函數可以內聯哪些 ?
? 不能,但是,大多數編譯器就不那么聰明了,因此這就需要我們的經驗來判斷。 ?
? 如果內聯函數不能增強行能,就避免使用它! ?
? */ ?
? ?
? /* ?
? 用指針代替數組 ? ?
? 在許多種情況下,可以用指針運算代替數組索引,這樣做常常能產生又快又短的 ?
? 代碼。與數組索引相比,指針一般能使代碼速度更快,占用空間更少。使用多維數 ?
? 組時差異更明顯。下面的代碼作用是相同的,但是效率不一樣。 ?
? ?
? char* ? pBuffer ? = ? new ? char[100]; ?
? nTestNumber ? = ? 0; ?
? ?
? for(dwIndex ? = ? 0;dwIndex ? < ? 100;dwIndex ? ++) ?
? { ?
? nTestNumber ? = ? pBuffer[dwIndex]; ?
? } ?
? ?
? char* ? pTemp ? = ? pBuffer; ?
? for(dwIndex ? = ? 0;dwIndex ? < ? 100;dwIndex ? ++) ?
? { ?
? nTestNumber ? = ? *(pTemp ? ++); ?
? } ?
? ?
? 指針方法的優點是,pBuffer的地址每次裝入地址pTemp后,在每次循環中只需對pTemp增量操作。 ?
? 在數組索引方法中,每次循環中都必須進行基于dwIndex值求數組下標的復雜運算。 ?
? */??

posted on 2006-10-16 20:39 @王一偉 閱讀(9832) 評論(6)  編輯 收藏 引用 所屬分類: 4. C++

Feedback

# re: inline函數 2006-10-29 10:48 Optimistic
inline函數的效率我一直是質疑的 曾經測過100萬次函數調用時INLINE和非INLINE的時間開銷 結果居然INLINE輸了。。。  回復  更多評論
  

# re: inline函數 2006-12-14 10:55 王一偉
啊 哦
我算了1億多次 還是inline強啊
有時候不是寫了inline就一定是inline的:)
你再測試下 看看是不是哪里出了問題
  回復  更多評論
  

# re: inline函數 2007-12-29 17:13 Solomon Joh
可以說明一下什么時候寫了inline就不一定是inline啊?就像聲明寄存器變量不一定在寄存器里?但是寄存器是編譯器負責,inline誰負責啊?  回復  更多評論
  

# re: inline函數 2007-12-30 08:03 @王一偉
呵呵 是的 寄存器變量的分配在編譯時獲得,編譯時會確定變量數據段的地址,包括寄存器變量。

inline也是編譯器負責 原生C++都是在編譯時進行inline化,而C++/CLI可以支持運行時的inline化

不知道是不是可以理解C++/CLI為一種動態語言了 呵呵,我對這不是太清楚 Solomon Jon可以解釋下  回復  更多評論
  

# re: inline函數 2007-12-30 08:12 @王一偉
inline化算是編譯時的一種優化,比如里面有for循環的時候,還有遞歸調用什么的,編譯器就會自動優化成非inline函數,inline的會導致代碼體積上升過快 呵呵。

這個是編譯到代碼段的行為。  回復  更多評論
  

# re: inline函數[未登錄] 2012-05-15 16:42 阿南
說的挺好  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲高清一区二区三区| 亚洲国产精品尤物yw在线观看| 欧美精品videossex性护士| 亚洲欧美一区二区三区在线| 一区二区精品在线| 在线亚洲成人| 欧美亚洲一区二区三区| 久久国产精品亚洲va麻豆| 久久深夜福利免费观看| 美女精品在线| 欧美精品色网| 国产精品女主播| 好男人免费精品视频| 亚洲高清一区二| 亚洲永久免费| 欧美一激情一区二区三区| 久久久之久亚州精品露出| 免费一级欧美在线大片| 亚洲国产片色| 亚洲女性喷水在线观看一区| 久久精品91| 欧美激情欧美激情在线五月| 国产精品午夜视频| 亚洲国产另类久久久精品极度| 日韩系列欧美系列| 久久成人免费| 亚洲国产精品嫩草影院| 亚洲网站在线播放| 免费看成人av| 国产一区二区av| 日韩一区二区精品葵司在线| 欧美在线999| 99ri日韩精品视频| 久久一本综合频道| 国产伦精品一区二区三区高清版 | 小处雏高清一区二区三区| 裸体歌舞表演一区二区| 欧美午夜精品久久久久久久| 一区二区三区在线看| 亚洲一级网站| 亚洲国产精品电影| 久久精品麻豆| 国产乱码精品一区二区三区忘忧草 | 亚洲国产精品久久久久秋霞影院| 正在播放欧美一区| 久久综合99re88久久爱| 亚洲午夜国产成人av电影男同| 裸体一区二区三区| 国产片一区二区| 亚洲深夜激情| 亚洲日本理论电影| 另类亚洲自拍| 精品999久久久| 久久国产精品72免费观看| 亚洲精品国产精品国自产观看浪潮| 久久精品国产在热久久| 国产日韩欧美日韩| 久久aⅴ国产欧美74aaa| 亚洲欧美激情视频| 国产麻豆精品视频| 欧美在线一区二区| 香蕉久久夜色| 国产一区二区三区的电影| 久久国产精品99精品国产| 亚洲欧美日韩专区| 国产一区二区久久精品| 久久久久久久综合日本| 久久xxxx| 亚洲国产天堂久久综合网| 欧美激情在线| 欧美喷潮久久久xxxxx| 中国女人久久久| 一区二区三区视频在线播放| 国产精品乱码一区二三区小蝌蚪| 亚洲男人的天堂在线| 亚洲尤物视频在线| 国内外成人在线视频| 女生裸体视频一区二区三区| 欧美a级片网| 亚洲神马久久| 久久不见久久见免费视频1| 尤物yw午夜国产精品视频明星 | 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 国产精品二区在线| 欧美一级专区免费大片| 午夜在线一区| 国产揄拍国内精品对白| 猫咪成人在线观看| 欧美激情国产日韩精品一区18| 在线一区日本视频| 欧美亚洲三区| 亚洲国产美女精品久久久久∴| 亚洲伦理中文字幕| 国产欧美精品在线播放| 好吊妞**欧美| 亚洲福利视频网| 亚洲激情午夜| 国产区亚洲区欧美区| 久久一区二区三区av| 欧美国产日韩a欧美在线观看| 亚洲影院在线| 老牛国产精品一区的观看方式| 亚洲精选久久| 欧美一区二区视频97| 亚洲精品免费网站| 午夜视频在线观看一区二区三区 | 中文日韩在线视频| 欧美在线三区| 亚洲视频视频在线| 性欧美18~19sex高清播放| 激情成人综合| 99re在线精品| 在线不卡中文字幕播放| 日韩网站在线观看| 国产色婷婷国产综合在线理论片a| 亚洲丰满在线| 一区免费观看| 亚洲欧美国产va在线影院| 亚洲欧洲精品一区二区| 午夜一区二区三区在线观看| 制服诱惑一区二区| 欧美国产激情| 久久一区视频| 国产精品草草| 日韩一级在线观看| 91久久夜色精品国产网站| 亚洲欧美日韩在线不卡| 亚洲午夜激情在线| 欧美成人免费全部| 噜噜噜噜噜久久久久久91| 国产日韩欧美三级| 亚洲视频精品在线| 亚洲一区二区精品在线| 欧美成人一区二区三区在线观看 | 亚洲国产精选| 午夜精品久久久久久久久久久久久 | 一本不卡影院| 欧美国产成人在线| 麻豆国产精品777777在线| 国产模特精品视频久久久久| 日韩午夜激情电影| 亚洲香蕉视频| 国产精品入口日韩视频大尺度| 亚洲少妇自拍| 性色av香蕉一区二区| 国产精品夜夜嗨| 性久久久久久| 欧美v日韩v国产v| 亚洲国产婷婷综合在线精品| 亚洲视频在线观看一区| 欧美电影美腿模特1979在线看| 一本久久综合亚洲鲁鲁| 快播亚洲色图| 亚洲国产一区二区视频| 亚洲美女视频在线观看| 欧美精品手机在线| 99国产精品视频免费观看一公开| 一本色道久久综合亚洲精品婷婷| 欧美日韩亚洲91| 亚洲网站视频福利| 久久久久九九九九| 亚洲电影在线| 欧美精品一区二区三区视频| 一区二区电影免费观看| 欧美一区二区啪啪| 禁久久精品乱码| 欧美精品日韩www.p站| 亚洲天堂久久| 美日韩精品视频| 一本大道久久a久久综合婷婷| 国产精品青草久久久久福利99| 性8sex亚洲区入口| 亚洲国产精品电影| 欧美一进一出视频| 亚洲日本在线观看| 国产精品人人做人人爽| 久久精品视频99| 亚洲精品中文字幕在线| 欧美在线观看你懂的| 亚洲精品1区2区| 国产精品男人爽免费视频1| 久久躁日日躁aaaaxxxx| 亚洲免费观看| 久久久久久**毛片大全| 亚洲深夜影院| 亚洲国产精品一区二区第四页av| 欧美日韩一区二区三区四区五区| 欧美一级午夜免费电影| 亚洲日本电影在线| 久久久久国产精品一区| 亚洲一区二区精品在线| 亚洲国产日韩欧美在线动漫| 国产精品主播| 欧美精品久久99久久在免费线| 翔田千里一区二区| 在线视频欧美精品| 亚洲黄页一区| 欧美成人免费网| 久久夜精品va视频免费观看| 午夜免费电影一区在线观看|