複製鏈接
請複製以下鏈接發送給好友

內聯函數

鎖定
計算機科學中,內聯函數(有時稱作在線函數編譯時期展開函數)是一種編程語言結構,用來建議編譯器對一些特殊函數進行內聯擴展(有時稱作在線擴展)。
中文名
內聯函數
外文名
Inline function
性    質
計算機術語
意思是
inline關鍵字修飾的函數
特    點
在編譯時將函數體嵌入每個調用處

內聯函數簡介

在計算機科學中,內聯函數(有時稱作在線函數編譯時期展開函數)是一種編程語言結構,用來建議編譯器對一些特殊函數進行內聯擴展(有時稱作在線擴展);也就是説建議編譯器將指定的函數體插入並取代每一處調用該函數的地方(上下文),從而節省了每次調用函數帶來的額外時間開支。但在選擇使用內聯函數時,必須在程序佔用空間和程序執行效率之間進行權衡,因為過多的比較複雜的函數進行內聯擴展將帶來很大的存儲資源開支。另外還需要特別注意的是對遞歸函數的內聯擴展可能引起部分編譯器的無窮編譯。 [1] 

內聯函數設計動機

內聯擴展是一種特別的用於消除調用函數時所造成的固有的時間消耗方法。一般用於能夠快速執行的函數,因為在這種情況下函數調用的時間消耗顯得更為突出。這種方法對於很小的函數也有空間上的益處,並且它也使得一些其他的優化成為可能。
沒有了內聯函式,程序員難以控制哪些函數內聯哪些不內聯;由編譯器自行決定是否內聯。加上這種控制維度准許特定於應用的知識,諸如執行函數的頻繁程度,被利用於選擇哪些函數要內聯。
此外,在一些語言中,內聯函數與編譯模型聯繫緊密:如在C++中,有必要在每個使用它的模塊中定義一個內聯函數;與之相對應的,普通函數必須定義在單個模塊中。這使得模塊編譯獨立於其他的模塊。 [1] 

內聯函數與宏的比較

通常,在C語言中,內聯展開的功能由帶參宏(Macros)在源碼級實現。內聯提供了幾個更好的方法:
  • 宏調用並不執行類型檢查,甚至連正常參數也不檢查,但是函數調用卻要檢查。
  • C語言的宏使用的是文本替換,可能導致無法預料的後果,因為需要重新計算參數和操作順序
  • 在宏中的編譯錯誤很難發現,因為它們引用的是擴展的代碼,而不是程序員鍵入的。
  • 許多結構體使用宏或者使用不同的語法來表達很難理解。內聯函數使用與普通函數相同的語言,可以隨意的內聯和不內聯。
  • 內聯代碼的調試信息通常比擴展的宏代碼更有用。 [1] 

內聯函數內聯函數的不足

除了通常使用內聯擴展可能帶來的問題,作為一種編程語言特性的內聯函數也可能並沒有看起來那麼有效,原因如下:
  • 通常,設計編譯器的程序設計者比大多數的程序設計者更清楚對於一個特定的函數是否合適進行內聯擴展;一些情況下,對於程序員指定的某些內聯函數,編譯器可能更傾向於不使用內聯甚至根本無法完成內聯。
  • 對於一些開發中的函數,它們可能從原來的不適合內聯擴展變得適合或者倒過來。儘管內聯函數或者非內聯函數的轉換易於宏的轉換,但增加的維護開支還是使得它的優點顯得更不突出了。
  • 對於基於C的編譯系統,內聯函數的使用可能大大增加編譯時間,因為每個調用該函數的地方都需要替換成函數體,代碼量的增加也同時帶來了潛在的編譯時間的增加。 [1] 

內聯函數限定符

內聯函數是在函數原型的前面加上inline (內聯)限定符。例如: [2] 

內聯函數參見

  • 內聯擴展(在線擴展)
參考資料
  • 1.    JANA, DEBASISH (1 January 2005). C++ AND OBJECT-ORIENTED PROGRAMMING PARADIGM. PHI Learning Pvt. Ltd. ISBN 978-81-203-2871-6.
  • 2.    馮矢勇.21世紀高職高專信息技術實訓教材 C++實訓教程:兵器工業出版社,2005年07月第1版:第23頁