C++內(nèi)聯(lián)函數(shù)(inline)

Tip1:

只有當(dāng)函數(shù)只有 10 行甚至更少時(shí)才將其定義為內(nèi)聯(lián)函數(shù).

定義: 當(dāng)函數(shù)被聲明為內(nèi)聯(lián)函數(shù)之后, 編譯器會將其內(nèi)聯(lián)展開, 而不是按通常的函數(shù)調(diào)用機(jī)制進(jìn)行調(diào)用.
優(yōu)點(diǎn): 當(dāng)函數(shù)體比較小的時(shí)候, 內(nèi)聯(lián)該函數(shù)可以令目標(biāo)代碼更加高效. 對于存取函數(shù)以及其它函數(shù)體比較短, 性能關(guān)鍵的函數(shù), 鼓勵(lì)使用內(nèi)聯(lián).
缺點(diǎn): 濫用內(nèi)聯(lián)將導(dǎo)致程序變慢. 內(nèi)聯(lián)可能使目標(biāo)代碼量或增或減, 這取決于內(nèi)聯(lián)函數(shù)的大小. 內(nèi)聯(lián)非常短小的存取函數(shù)通常會減少代碼大小, 但內(nèi)聯(lián)一個(gè)相當(dāng)大的函數(shù)將戲劇性的增加代碼大小. 現(xiàn)代處理器由于更好的利用了指令緩存, 小巧的代碼往往執(zhí)行更快。
結(jié)論: 一個(gè)較為合理的經(jīng)驗(yàn)準(zhǔn)則是, 不要內(nèi)聯(lián)超過 10 行的函數(shù). 謹(jǐn)慎對待析構(gòu)函數(shù), 析構(gòu)函數(shù)往往比其表面看起來要更長, 因?yàn)橛须[含的成員和基類析構(gòu)函數(shù)被調(diào)用! 另一個(gè)實(shí)用的經(jīng)驗(yàn)準(zhǔn)則: 內(nèi)聯(lián)那些包含循環(huán)或 switch 語句的函數(shù)常常是得不償失 (除非在大多數(shù)情況下, 這些循環(huán)或 switch 語句從不被執(zhí)行). 有些函數(shù)即使聲明為內(nèi)聯(lián)的也不一定會被編譯器內(nèi)聯(lián), 這點(diǎn)很重要; 比如虛函數(shù)和遞歸函數(shù)就不會被正常內(nèi)聯(lián). 通常, 遞歸函數(shù)不應(yīng)該聲明成內(nèi)聯(lián)函數(shù).(遞歸調(diào)用堆棧的展開并不像循環(huán)那么簡單, 比如遞歸層數(shù)在編譯時(shí)可能是未知的, 大多數(shù)編譯器都不支持內(nèi)聯(lián)遞歸函數(shù)).

  • 虛函數(shù)不能定義為內(nèi)聯(lián)函數(shù)的原因:
    inline是在編譯器將函數(shù)類容替換到函數(shù)調(diào)用處袜刷,是靜態(tài)編譯的。而虛函數(shù)是動(dòng)態(tài)調(diào)用的气笙,在編譯器并不知道需要調(diào)用的是父類還是子類的虛函數(shù),所以不能夠inline聲明展開延曙,所以編譯器會忽略

Tip2:

-inl.h |文件:復(fù)雜的內(nèi)聯(lián)函數(shù)的定義, 應(yīng)放在后綴名為 -inl.h 的頭文件中. 內(nèi)聯(lián)函數(shù)的定義必須放在頭文件中, 編譯器才能在調(diào)用點(diǎn)內(nèi)聯(lián)展開定義.

然而, 實(shí)現(xiàn)代碼理論上應(yīng)該放在 .c 文件中, 我們不希望 .h |文件中有太多實(shí)現(xiàn)代碼, 除非在可讀性和性能上有明顯優(yōu)勢. 如果內(nèi)聯(lián)函數(shù)的定義比較短小, 邏輯比較簡單, 實(shí)現(xiàn)代碼放在 .h |文件里沒有任何問題. 比如, 存取函數(shù)的實(shí)現(xiàn)理所當(dāng)然都應(yīng)該放在類定義內(nèi). 出于編寫者和調(diào)用者的方便, 較復(fù)雜的內(nèi)聯(lián)函數(shù)也可以放到 .h |文件中, 如果你覺得這樣會使頭文件顯得笨重, 也可以把它萃取到單獨(dú)的 -inl.h 中. 這樣把實(shí)現(xiàn)和類定義分離開來, 當(dāng)需要時(shí)包含對應(yīng)的 -inl.h 即可皆愉。

考一考

關(guān)于c++的inline關(guān)鍵字,以下說法正確的是()
A.使用inline關(guān)鍵字的函數(shù)會被編譯器在調(diào)用處展開
B.頭文件中可以包含inline函數(shù)的聲明
C.可以在同一個(gè)項(xiàng)目的不同源文件內(nèi)定義函數(shù)名相同但實(shí)現(xiàn)不同的inline函數(shù)
D.定義在Class聲明內(nèi)的成員函數(shù)默認(rèn)是inline函數(shù)
E.優(yōu)先使用Class聲明內(nèi)定義的inline函數(shù)
F.優(yōu)先使用Class實(shí)現(xiàn)的內(nèi)inline函數(shù)的實(shí)現(xiàn)

解答:

A 如果只聲明含有inline關(guān)鍵字,就沒有內(nèi)聯(lián)的效果田度。 內(nèi)聯(lián)函數(shù)的定義必須放在頭文件中, 編譯器才能在調(diào)用點(diǎn)內(nèi)聯(lián)展開定義. 有些函數(shù)即使聲明為內(nèi)聯(lián)的也不一定會被編譯器內(nèi)聯(lián), 這點(diǎn)很重要; 比如虛函數(shù)和遞歸函數(shù)就不會被正常內(nèi)聯(lián). 通常, 遞歸函數(shù)不應(yīng)該聲明成內(nèi)聯(lián)函數(shù).
B 內(nèi)聯(lián)函數(shù)應(yīng)該在頭文件中定義,這一點(diǎn)不同于其他函數(shù)解愤。編譯器在調(diào)用點(diǎn)內(nèi)聯(lián)展開函數(shù)的代碼時(shí)镇饺,必須能夠找到 inline 函數(shù)的定義才能將調(diào)用函數(shù)替換為函數(shù)代碼,而對于在頭文件中僅有函數(shù)聲明是不夠的送讲。
C 當(dāng)然內(nèi)聯(lián)函數(shù)定義也可以放在源文件中奸笤,但此時(shí)只有定義的那個(gè)源文件可以用它,而且必須為每個(gè)源文件拷貝一份定義(即每個(gè)源文件里的定義必須是完全相同的)哼鬓,當(dāng)然即使是放在頭文件中监右,也是對每個(gè)定義做一份拷貝,只不過是編譯器替你完成這種拷貝罷了异希。但相比于放在源文件中健盒,放在頭文件中既能夠確保調(diào)用函數(shù)是定義是相同的,又能夠保證在調(diào)用點(diǎn)能夠找到函數(shù)定義從而完成內(nèi)聯(lián)(替換)称簿。 對于由兩個(gè)文件compute.C和draw.C構(gòu)成的程序來說扣癣,程序員不能定義這樣的min()函數(shù),它在compute.C中指一件事情憨降,而在draw.C中指另外一件事情父虑。如果兩個(gè)定義不相同,程序?qū)形炊x的行為:為保證不會發(fā)生這樣的事情授药,建議把inline函數(shù)的定義放到頭文件中士嚎。在每個(gè)調(diào)用該inline函數(shù)的文件中包含該頭文件。這種方法保證對每個(gè)inline函數(shù)只有一個(gè)定義悔叽,且程序員無需復(fù)制代碼航邢,并且不可能在程序的生命期中引起無意的不匹配的事情。
D 正確骄蝇。 定義在類聲明之中的成員函數(shù)將自動(dòng)地成為內(nèi)聯(lián)函數(shù),例如: class A { public: void Foo(int x, int y) { … } // 自動(dòng)地成為內(nèi)聯(lián)函數(shù) }
EF 在每個(gè)調(diào)用該inline函數(shù)的文件中包含該頭文件操骡。這種方法保證對每個(gè)inline函數(shù)只有一個(gè)定義九火,且程序員無需復(fù)制代碼赚窃,并且不可能在程序的生命期中引起無意的不匹配的事情。最好只有一個(gè)定義岔激!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勒极,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虑鼎,更是在濱河造成了極大的恐慌辱匿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炫彩,死亡現(xiàn)場離奇詭異匾七,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)江兢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門昨忆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杉允,你說我怎么就攤上這事邑贴。” “怎么了叔磷?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵拢驾,是天一觀的道長。 經(jīng)常有香客問我改基,道長繁疤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任寥裂,我火速辦了婚禮嵌洼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘封恰。我一直安慰自己麻养,他們只是感情好诺舔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著低飒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褥赊。 梳的紋絲不亂的頭發(fā)上糕档,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音拌喉,去河邊找鬼俐银。 笑死端仰,一個(gè)胖子當(dāng)著我的面吹牛捶惜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荔烧,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吱七,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了踊餐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤市袖,失蹤者是張志新(化名)和其女友劉穎烁涌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撮执,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年蜓肆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谋币。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕾额,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出退个,到底是詐尸還是另有隱情,我是刑警寧澤语盈,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布缰泡,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏资溃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望符隙。 院中可真熱鬧,春花似錦霹疫、人聲如沸综芥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至国觉,卻和暖如春虾啦,著一層夾襖步出監(jiān)牢的瞬間麻诀,已是汗流浹背傲醉。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呻引,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓苞七,卻偏偏與公主長得像挪丢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子乾蓬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • inline概念 在c++中,函數(shù)調(diào)用是會產(chǎn)生額外的時(shí)間開銷的撵渡,如果函數(shù)本身代碼很短,執(zhí)行很快趋距,并且該函數(shù)被反復(fù)調(diào)...
    檀香靜雪閱讀 131評論 0 0
  • 一节腐,內(nèi)聯(lián)函數(shù)語法 ? inline要起作用,必須要與函數(shù)定義放在一起外盯,而不是函數(shù)的聲明 二翼雀,內(nèi)聯(lián)函數(shù)的作用 ? 當(dāng)...
    老騰的黑貓閱讀 196評論 0 1
  • C++內(nèi)聯(lián)函數(shù)inlineC++ 內(nèi)聯(lián)函數(shù)是通常與類一起使用。如果一個(gè)函數(shù)是內(nèi)聯(lián)的箱熬,那么在編譯時(shí),編譯器會把該函數(shù)...
    Optimization閱讀 146評論 0 0
  • 函數(shù)是一個(gè)可以重復(fù)使用的代碼塊城须,CPU 會一條一條地挨著執(zhí)行其中的代碼官地。CPU 在執(zhí)行主調(diào)函數(shù)代碼時(shí)如果遇到了被調(diào)...
    咻比嘟嘩丶閱讀 292評論 0 2
  • 內(nèi)聯(lián)的疑惑 寫這篇文章的初衷源自于對netdata項(xiàng)目把C函數(shù)聲明為static inline的用法不解。從語言特...
    typesafe閱讀 2,100評論 1 1