天天看點

C++内聯函數(C++ inline)詳解

内聯函數的使用有利于代碼的重用,可以提高開發效率,增加程式的可靠性,也利于分工合作和修改維護。  

函數在執行時,首先要在棧中為形參和局部變量配置設定存儲空間,然後還要将實參複制給形參,最後也要将傳回位址入棧(該位址指明了函數結束後,程式應該從哪開始執行),

最後跳轉到函數内部執行,這個過程是要浪費時間的。

另外函數在執行return語句時,需要從棧中回收形參和局部變量的存儲空間,然後從棧中取出傳回位址,跳轉到該位址執行,這個過程也是需要時間。

這就是函數調用的基本過程,這個過程與将函數直接在代碼中抄一遍,節省了人力,但是也為程式的運作帶來的額外的開銷。

一般來說,這種開銷可以忽略不計的,但是如果函數裡面的代碼比較少時,執行時間本來就短,現在再給它套上一個函數體,就增加了額外的開銷,

是以此時這個開銷就不能忽略不計了,再加上如果這個函數被調用千百次,函數調用導緻的時間開銷可能就會使得程式運作明顯變慢。

為特别注重程式執行效率,适合編寫底層系統軟體的進階程式設計語言,C++ 用 inline 關鍵字較好地解決了函數調用開銷的問題。

在 C++ 中,可以在定義函數時,在傳回值類型前面加上 inline 關鍵字。如:

inline int Max (int a, int b)
{
    if(a >b)
        return a;
    return b;
}

           

加了 inline 關鍵字的函數稱為“内聯函數”。内聯函數和普通函數的差別在于:當編譯器處理調用内聯函數的語句時,不會将該語句編譯成函數調用的指令,而是直接将整個函數體的代碼插人調用語句處,就像整個函數體在調用處被重寫了一遍一樣。 

有了内聯函數,就能像調用一個函數那樣友善地重複使用一段代碼,而不需要付出執行函數調用的額外開銷。很顯然,使用内聯函數會使最終可執行程式的體積增加。以時間換取空間,或增加空間消耗來節省時間,這是計算機學科中常用的方法。

内聯函數中的代碼應該隻是很簡單、執行很快的幾條語句。如果一個函數較為複雜,它執行的時間可能上萬倍于函數調用的額外開銷,那麼将其作為内聯函數處理的結果是付出讓代碼體積增加不少的代價,卻隻使速度提高了萬分之一,這顯然是不劃算的,是以内聯函數一般适用于那些經常被調用的函數,并且函數内部語句較簡單。

有時函數看上去很簡單,例如隻有一個包含一兩條語句的循環,但該循環的執行次數可能很多,要消耗大量時間,那麼這種情況也不适合将其實作為内聯函數。

另外,需要注意的是,調用内聯函數的語句前必須先在函數體前面聲明為inline,定義的時候有無沒有影響。

轉載于:https://www.cnblogs.com/liuzeyu12a/p/10540236.html