c++ ? inline

在C中卵迂,編譯器使用宏定義節(jié)省編譯時間。在C++中使用內(nèi)聯(lián)函數(shù)來實現(xiàn)同樣的效果绒净。在程序編譯時见咒,編譯器會將內(nèi)聯(lián)函數(shù)調(diào)用處用函數(shù)體替換,這一點類似于C語言中的宏擴展挂疆。

1 什么是內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù)是C++的增強特性之一改览,用來降低程序的運行時間。當內(nèi)聯(lián)函數(shù)收到編譯器的指示時缤言,即可發(fā)生內(nèi)聯(lián):編譯器將使用函數(shù)的定義體來替代函數(shù)調(diào)用語句恃疯,這種替代行為發(fā)生在編譯階段而非程序運行階段。

注意:內(nèi)聯(lián)函數(shù)僅僅是對編譯器的內(nèi)聯(lián)建議墨闲,編譯器是否覺得采取你的建議取決于函數(shù)是否符合內(nèi)聯(lián)的有利條件今妄。如何函數(shù)體非常大,那么編譯器將忽略函數(shù)的內(nèi)聯(lián)聲明鸳碧,而將內(nèi)聯(lián)函數(shù)作為普通函數(shù)處理盾鳞。

2 如何使用內(nèi)聯(lián)函數(shù)

定義函數(shù)時,在函數(shù)的最前面以關鍵字“inline”聲明函數(shù)瞻离,即可使函數(shù)成為內(nèi)聯(lián)聲明函數(shù)腾仅。


Class A
{
  Public:
      inline int add(int a, int b)
      {
        return (a + b);
      };
}
Class A
{
  Public:
    int add(int a, int b);
};
inline int A::add(int a, int b)
{
    return (a + b);
}

3 為什么使用內(nèi)聯(lián)函數(shù)

在某個程序上下文內(nèi)頻繁地調(diào)用某個函數(shù),其調(diào)用函數(shù)的花銷會有多大:當遇到普通函數(shù)的調(diào)用指令時套利,程序會保存當前函數(shù)的執(zhí)行現(xiàn)場推励,將函數(shù)中的局部變量以及函數(shù)地址壓入堆棧鹤耍,然后再將即將調(diào)用的新函數(shù)加載到內(nèi)存中,這要經(jīng)歷復制參數(shù)值验辞、跳轉(zhuǎn)到所調(diào)用函數(shù)的內(nèi)存位置稿黄、執(zhí)行函數(shù)代碼、存儲函數(shù)返回值等過程跌造,當函數(shù)執(zhí)行完后杆怕,再獲取之前正在調(diào)用的函數(shù)的地址,回去繼續(xù)執(zhí)行那個函數(shù)壳贪,運行時間開銷簡直太多了陵珍。
C++內(nèi)聯(lián)函數(shù)提供了替代函數(shù)調(diào)用的可選方案,通過inline聲明违施,編譯器首先在函數(shù)調(diào)用處使用函數(shù)體本身語句替換了函數(shù)調(diào)用語句互纯,然后編譯替換后的代碼。因此磕蒲,通過內(nèi)聯(lián)函數(shù)留潦,編譯器不需要跳轉(zhuǎn)到內(nèi)存其他地址去執(zhí)行函數(shù)調(diào)用,也不需要保留函數(shù)調(diào)用時的現(xiàn)場數(shù)據(jù)亿卤。

優(yōu)點

  • 它通過避免函數(shù)調(diào)用所帶來的開銷來提高你程序的運行速度。
  • 當函數(shù)調(diào)用發(fā)生時鹿霸,它節(jié)省了變量彈棧排吴、壓棧的開銷。
  • 它避免了一個函數(shù)執(zhí)行完返回原現(xiàn)場的開銷懦鼠。
  • 通過將函數(shù)聲明為內(nèi)聯(lián)钻哩,你可以把函數(shù)定義放在頭文件內(nèi)。

缺點

  • 因為代碼的擴展肛冶,內(nèi)聯(lián)函數(shù)增大了可執(zhí)行程序的體積街氢。
  • C++內(nèi)聯(lián)函數(shù)的展開是在編譯階段,這就意味著如果你的內(nèi)聯(lián)函數(shù)發(fā)生了改動睦袖,那么就需要重新編譯代碼珊肃。
  • 當你把內(nèi)聯(lián)函數(shù)放在頭文件中時,它將會使你的頭文件信息變多馅笙,不過頭文件的使用者不用在意這些伦乔。
  • 有時候內(nèi)聯(lián)函數(shù)并不受到青睞,比如在嵌入式系統(tǒng)中董习,嵌入式系統(tǒng)的存儲約束可能不允許體積很大的可執(zhí)行程序烈和。

4 什么時候使用內(nèi)聯(lián)函數(shù)

在程序設計時,每個函數(shù)都可以聲明為inline皿淋。下面列舉一些有用的建議:

  • 當對程序執(zhí)行性能有要求時
  • 當你想宏定義一個函數(shù)時
  • 在類內(nèi)部定義的函數(shù)會默認聲明為inline函數(shù)招刹,這有利于類實現(xiàn)細節(jié)的隱藏恬试。

5 注意

  • 內(nèi)聯(lián)聲明只是一種對編譯器的建議,編譯器是否采用內(nèi)聯(lián)措施由編譯器自己來決定疯暑。甚至在匯編階段或鏈接階段训柴,一些沒有inline聲明的函數(shù)編譯器也會將它內(nèi)聯(lián)展開。
  • 編譯器的內(nèi)聯(lián)看起來就像是代碼的復制與粘貼缰儿,這與預處理宏是很不同的:宏是強制的內(nèi)聯(lián)展開畦粮,可能將會污染所有的命名空間與代碼,將為程序的調(diào)試帶來困難乖阵。
  • 所有類中定義的函數(shù)都默認聲明為inline函數(shù)宣赔,因此我們不用顯示地去聲明inline。虛函數(shù)不允許內(nèi)聯(lián)瞪浸。
  • 雖然說模板函數(shù)放在頭文件中儒将,但它們不一定是內(nèi)聯(lián)的。(不是說定義在頭文件中的函數(shù)都是內(nèi)聯(lián)函數(shù))对蒲。

參考

What is C++ inline functions
Inline Functions

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钩蚊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蹈矮,更是在濱河造成了極大的恐慌砰逻,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泛鸟,死亡現(xiàn)場離奇詭異蝠咆,居然都是意外死亡,警方通過查閱死者的電腦和手機北滥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門刚操,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人再芋,你說我怎么就攤上這事菊霜。” “怎么了济赎?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵鉴逞,是天一觀的道長。 經(jīng)常有香客問我司训,道長华蜒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任豁遭,我火速辦了婚禮叭喜,結果婚禮上,老公的妹妹穿的比我還像新娘蓖谢。我一直安慰自己捂蕴,他們只是感情好譬涡,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啥辨,像睡著了一般涡匀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溉知,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天陨瘩,我揣著相機與錄音,去河邊找鬼级乍。 笑死舌劳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的玫荣。 我是一名探鬼主播甚淡,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捅厂!你這毒婦竟也來了贯卦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤焙贷,失蹤者是張志新(化名)和其女友劉穎撵割,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辙芍,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡啡彬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了沸手。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片外遇。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡注簿,死狀恐怖契吉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诡渴,我是刑警寧澤捐晶,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站妄辩,受9級特大地震影響惑灵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眼耀,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一英支、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哮伟,春花似錦干花、人聲如沸妄帘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抡驼。三九已至,卻和暖如春肿仑,著一層夾襖步出監(jiān)牢的瞬間致盟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工尤慰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馏锡,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓割择,卻偏偏與公主長得像眷篇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荔泳,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

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

  • 重新系統(tǒng)學習下C++蕉饼;但是還是少了好多知識點;socket玛歌;unix昧港;stl;boost等支子; C++ 教程 | 菜...
    kakukeme閱讀 19,833評論 0 50
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理创肥,服務發(fā)現(xiàn),斷路器值朋,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別叹侄? C沒有Protection行為...
    阿面a閱讀 7,648評論 0 10
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,513評論 1 51
  • 收集非原創(chuàng)文章,如遇原作者昨登,請私聊我趾代,我會表明出處! 1--10 1. C++中什么數(shù)據(jù)分配在椃崂保或堆撒强,靜態(tài)存儲區(qū)以...
    Juinjonn閱讀 4,939評論 0 30