行內函數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)行內函數中一般不能有複雜操作,比如:迴圈或遞迴呼叫