-
內聯函數
鎖定
- 中文名
- 內聯函數
- 外文名
- Inline function
- 性 質
- 計算機術語
- 意思是
- inline關鍵字修飾的函數
- 特 點
- 在編譯時將函數體嵌入每個調用處
內聯函數簡介
在計算機科學中,內聯函數(有時稱作在線函數或編譯時期展開函數)是一種編程語言結構,用來建議編譯器對一些特殊函數進行內聯擴展(有時稱作在線擴展);也就是説建議編譯器將指定的函數體插入並取代每一處調用該函數的地方(上下文),從而節省了每次調用函數帶來的額外時間開支。但在選擇使用內聯函數時,必須在程序佔用空間和程序執行效率之間進行權衡,因為過多的比較複雜的函數進行內聯擴展將帶來很大的存儲資源開支。另外還需要特別注意的是對遞歸函數的內聯擴展可能引起部分編譯器的無窮編譯。
[1]
內聯函數設計動機
內聯擴展是一種特別的用於消除調用函數時所造成的固有的時間消耗方法。一般用於能夠快速執行的函數,因為在這種情況下函數調用的時間消耗顯得更為突出。這種方法對於很小的函數也有空間上的益處,並且它也使得一些其他的優化成為可能。
沒有了內聯函式,程序員難以控制哪些函數內聯哪些不內聯;由編譯器自行決定是否內聯。加上這種控制維度准許特定於應用的知識,諸如執行函數的頻繁程度,被利用於選擇哪些函數要內聯。
內聯函數與宏的比較
通常,在C語言中,內聯展開的功能由帶參宏(Macros)在源碼級實現。內聯提供了幾個更好的方法:
- 宏調用並不執行類型檢查,甚至連正常參數也不檢查,但是函數調用卻要檢查。
- C語言的宏使用的是文本替換,可能導致無法預料的後果,因為需要重新計算參數和操作順序。
- 在宏中的編譯錯誤很難發現,因為它們引用的是擴展的代碼,而不是程序員鍵入的。
- 許多結構體使用宏或者使用不同的語法來表達很難理解。內聯函數使用與普通函數相同的語言,可以隨意的內聯和不內聯。
內聯函數內聯函數的不足
除了通常使用內聯擴展可能帶來的問題,作為一種編程語言特性的內聯函數也可能並沒有看起來那麼有效,原因如下:
- 通常,設計編譯器的程序設計者比大多數的程序設計者更清楚對於一個特定的函數是否合適進行內聯擴展;一些情況下,對於程序員指定的某些內聯函數,編譯器可能更傾向於不使用內聯甚至根本無法完成內聯。
- 對於一些開發中的函數,它們可能從原來的不適合內聯擴展變得適合或者倒過來。儘管內聯函數或者非內聯函數的轉換易於宏的轉換,但增加的維護開支還是使得它的優點顯得更不突出了。
內聯函數限定符
內聯函數參見
- 內聯擴展(在線擴展)