亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么標頭中包含C ++內聯函數?

為什么標頭中包含C ++內聯函數?

C++
動漫人物 2019-10-15 09:36:50
注意:這不是關于如何使用內聯函數或它們如何工作的問題,更多的是為什么要按原樣完成它們。類成員函數的聲明不需要將函數定義為inline,而只是函數的實際實現。例如,在頭文件中:struct foo{    void bar(); // no need to define this as inline}那么,為什么一類功能的內嵌實施有是在頭文件?為什么不能將內聯函數放在.cpp文件中?如果我嘗試將內聯定義放入.cpp文件中,則會出現以下錯誤:error LNK2019: unresolved external symbol "public: void __thiscall foo::bar(void)"(?bar@foo@@QAEXXZ) referenced in function _main 1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe : fatal error LNK1120: 1 unresolved externals
查看完整描述

3 回答

?
手掌心

TA貢獻1942條經驗 獲得超3個贊

有兩種查看方式:

  1. 內聯函數在標頭中定義,因為為了內聯函數調用,編譯器必須能夠看到函數主體。為了使天真的編譯器做到這一點,函數主體必須與調用位于同一轉換單元中。(現代的編譯器可以跨翻譯單元進行優化,因此即使函數定義位于單獨的翻譯單元中,也可以內聯函數調用,但是這些優化是昂貴的,并不總是啟用的,并且也不一定總是受支持。編譯器)

  2. 必須標記標inline頭中定義的函數,因為否則,包含標頭的每個翻譯單元將包含該函數的定義,并且鏈接程序將抱怨多個定義(違反“一個定義規則”)。的inline關鍵字抑制此,允許多個翻譯單元包含(相同)的定義。

這兩種解釋確實可以歸結為以下事實:inline關鍵字不能完全滿足您的期望。

C ++編譯器可以隨時隨地應用內聯優化(將函數調用替換為被調用函數的主體,以節省調用開銷),只要它不會改變程序的可觀察行為即可。

inline關鍵字使得它更容易讓編譯器應用此優化,通過允許函數定義在多個翻譯單元是可見的,但使用關鍵字并不意味著編譯器內聯函數,而不是使用關鍵字不禁止編譯器內聯函數。


查看完整回答
反對 回復 2019-10-15
  • 3 回答
  • 0 關注
  • 498 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號