1. 程式人生 > >行內函數inline

行內函數inline

一、什麼叫inline函式? 

當編譯器發現某段程式碼在呼叫一個行內函數時,它不是去呼叫該函式,而是將該函式的程式碼,整段插入到當前位置。這樣做的好處是省去了呼叫的過程,加快程式執行速度。(函式的呼叫過程,由於有前面所說的引數入棧等操作,所以總要多佔用一些時間)。這樣做的不好處:由於每當程式碼呼叫到行內函數,就需要在呼叫處直接插入一段該函式的程式碼,所以程式的體積將增大。

二、inline 函式的宣告或定義 

inline int max(int a, int b) 

return (a>b)? a : b; 
}

行內函數的本質是,節省時間但是消耗空間。

三、inline函式的規則

(1)、一個函式可以自已呼叫自已,稱為遞迴呼叫(後面講到),含有遞迴呼叫的函式不能設定為inline;

(2)、使用了複雜流程控制語句:迴圈語句和switch語句,無法設定為inline;

(3)、由於inline增加體積的特性,所以建議inline函式內的程式碼應很短小。最好不超過5行。

(4)、inline僅做為一種“請求”,特定的情況下,編譯器將不理會inline關鍵字,而強制讓函式成為普通函式。出現這種情況,編譯器會給出警告訊息。

(5)、在你呼叫一個行內函數之前,這個函式一定要在之前有宣告或已定義為inline,如果在前面宣告為普通函式,而在呼叫程式碼後面才定義為一個inline函式,程式可以通過編譯,但該函式沒有實現inline。比如下面程式碼片段: 
                  //函式一開始沒有被宣告為inline: 
                 void foo(); 
                //然後就有程式碼呼叫它: 
                 foo(); 
                //在呼叫後才有定義函式為inline: 
                 inline void foo() 
                { 
.                     ..... 
                 } 
程式碼是foo()函式最終沒有實現inline;

(6)為了除錯方便,在程式處於除錯階段時,所有行內函數都不被實現。

四、定義在類宣告之中的成員函式將自動地成為行內函數

// 標頭檔案

class A

{

public:

void Foo(int x, int y);

}

// 定義檔案

inline void A::Foo(int x, int y){}

五、謹慎使用行內函數

1)內聯是以程式碼膨脹(複製)為代價,僅僅省去了函式呼叫的開銷,從而提高函式的執行效率。如果執行函式體內程式碼的時間,相比於函式呼叫的開銷較大,那麼效率的收穫會很少。另一方面,每一處行內函數的呼叫都要複製程式碼,將使程式的總程式碼量增大,消耗更多的記憶體空間。


2)如果函式體內的程式碼比較長,使用內聯將導致記憶體消耗代價較高。

3)如果函式體內出現迴圈,那麼執行函式體內程式碼的時間要比函式呼叫的開銷大。

六、行內函數的敘述正確

1)內聯是以程式碼膨脹(複製)為代價,僅僅省去了函式呼叫的開銷;

2)如果行內函數體內的程式碼比較長,使用內聯將導致記憶體消耗代價較高;

3)如果行內函數的函式體過大,一般的編譯器會放棄內聯方式,而採用普通的方式呼叫函式。這樣,行內函數就和普通函式執行效率一樣了;

4)在類中宣告同時定義的成員函式,一般自動轉化為行內函數;

5)行內函數中一般不能有複雜操作,比如:迴圈或遞迴呼叫