c++ 內聯函數
在c++中我們通常定義以下函數來求兩個整數的最大值:?
int max(int a, int b) { return a > b ? a : b; }
但是這樣寫成函數有一個潛在的缺點:調用函數比求解等價表達式要慢得多。在大多數的機器上,調用函數都要做很多工作:調用前要先保存寄存器,并在返回時恢復,復制實參,程序還必須轉向一個新位置執行。
在c++中可以使用內聯函數,其目的是為了提高函數的執行效率,通常與類一起使用。如果一個函數是內聯的,那么在編譯時,編譯器會把該函數的代碼副本放置在每個調用該函數的地方。
對內聯函數進行任何修改,都需要重新編譯函數的所有客戶端,因為編譯器需要重新更換一次所有的代碼,否則將會繼續使用舊的函數。
如果想把一個函數定義為內聯函數,則需要在函數名前面放置關鍵字 inline,在調用函數之前需要對函數進行定義。如果已定義的函數多于一行,編譯器會忽略 inline 限定符。
在類定義中的定義的函數都是內聯函數,即使沒有使用 inline 說明符。
下面是使用內聯函數來返回兩個數中的最大值:
#include <iostream> using namespace std; inline int max(int x, int y) { return (x > y)? x : y; } // 程序的主函數 int main( ) { cout << "max (20,10): " << max(20,10) << endl; cout << "max (0,200): " << max(0,200) << endl; cout << "max (100,1010): " << max(100,1010) << endl; return 0; }
當上面的代碼被編譯和執行時,它會產生下列結果:
max (20,10): 20 max (0,200): 200 max (100,1010): 1010
有了內聯函數,就能像調用一個函數那樣方便地重復使用一段代碼,而不需要付出執行函數調用的額外開銷。很顯然,使用內聯函數會是最終可執行程序的體積增加。以空間換取時間,或消耗時間來增加空間,這是計算機學科中常用的方法。
內聯函數中的代碼應該只是很簡單、執行很快的幾條語句。如果一個函數較為復雜,它執行的時間可能上萬倍于函數調用的額外開銷,那么將其作為內聯函數處理的結果是付出讓代碼體積增加不少的代價,卻只使速度提高了萬分之一,這顯然是不劃算的,而且有些函數即使聲明為內聯的也不一定會被編譯器內聯。
有時函數看上去很簡單,例如只有一個包含一兩條語句的循環,但該循環的執行次數可能很多,要消耗大量時間,那么這種情況也不適合將其實現為內聯函數。
另外需要注意的是,調用內聯函數的語句前必須已經出現內聯函數的定義(即整個函數體),而不能只出現內聯函數的聲明。