內聯函式

內聯函式

計算機科學中,內聯函式(有時稱作線上函式編譯時期展開函式)是一種程式語言結構,用來建議編譯器對一些特殊函式進行內聯擴展(有時稱作線上擴展)。

基本介紹

  • 中文名:內聯函式
  • 外文名:Inline function
  • 性質:計算機術語
  • 意思是:inline關鍵字修飾的函式
  • 特點:在編譯時將函式體嵌入每個調用處
簡介,設計內聯函式的動機,與宏的比較,內聯函式的不足,參見,

簡介

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

設計內聯函式的動機

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

與宏的比較

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

內聯函式的不足

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

參見

  • 內聯擴展(線上擴展)

相關詞條

熱門詞條

聯絡我們