簡介
在
計算機科學中,
內聯函式(有時稱作
線上函式或
編譯時期展開函式)是一種
程式語言結構,用來建議
編譯器對一些特殊
函式進行內聯擴展(有時稱作
線上擴展);也就是說建議編譯器將指定的函式體插入並取代每一處調用該函式的地方(
上下文),從而節省了每次調用函式帶來的額外時間開支。但在選擇使用內聯函式時,必須在程式占用空間和程式執行效率之間進行權衡,因為過多的比較複雜的函式進行內聯擴展將帶來很大的存儲資源開支。另外還需要特別注意的是對
遞歸函式的內聯擴展可能引起部分編譯器的無窮編譯。
設計內聯函式的動機
內聯擴展是一種特別的用於消除調用函式時所造成的固有的時間消耗方法。一般用於能夠快速執行的函式,因為在這種情況下函式調用的時間消耗顯得更為突出。這種方法對於很小的函式也有空間上的益處,並且它也使得一些其他的最佳化成為可能。
沒有了內聯函式,程式員難以控制哪些函式內聯哪些不內聯;由編譯器自行決定是否內聯。加上這種控制維度準許特定於套用的知識,諸如執行函式的頻繁程度,被利用於選擇哪些函式要內聯。
此外,在一些語言中,內聯函式與編譯模型聯繫緊密:如在
C++中,有必要在每個使用它的模組中定義一個內聯函式;與之相對應的,普通函式必須定義在單個模組中。這使得模組編譯獨立於其他的模組。
與宏的比較
通常,在
C語言中,內聯展開的功能由帶參宏(Macros)在源碼級實現。內聯提供了幾個更好的方法:
內聯函式的不足
除了通常使用內聯擴展可能帶來的問題,作為一種程式語言特性的內聯函式也可能並沒有看起來那么有效,原因如下:
通常,編譯器比程式設計者更清楚對於一個特定的函式是否合適進行內聯擴展;一些情況下,對於程式設計師指定的某些內聯函式,編譯器可能更傾向於不使用內聯甚至根本無法完成內聯。
對於一些開發中的函式,它們可能從原來的不適合內聯擴展變得適合或者倒過來。儘管內聯函式或者非內聯函式的轉換易於宏的轉換,但增加的維護開支還是使得它的優點顯得更不突出了。
對於基於C的編譯系統,內聯函式的使用可能大大增加編譯時間,因為每個調用該函式的地方都需要替換成函式體,代碼量的增加也同時帶來了潛在的編譯時間的增加。
參見