C++ 內聯函數inline案例詳解

使用函數能夠避免將相同代碼重寫多次的麻煩,還能減少可執行程序的體積,但也會帶來程序運行時間上的開銷。

函數調用在執行時,首先要在棧中為形參和局部變量分配存儲空間,然後還要將實參的值復制給形參,接下來還要將函數的返回地址(該地址指明瞭函數執行結束後,程序應該回到哪裡繼續執行)放入棧中,最後才跳轉到函數內部執行。這個過程是要耗費時間的。

另外,函數執行 return 語句返回時,需要從棧中回收形參和局部變量占用的存儲空間,然後從棧中取出返回地址,再跳轉到該地址繼續執行,這個過程也要耗費時間。

總之,使用函數調用語句和直接把函數中的代碼重新抄寫一遍相比,節省瞭人力,但是帶來瞭程序運行時間上的額外開銷。

一般情況下,這個開銷可以忽略不計。但是,如果一個函數內部沒有幾條語句,執行時間本來就非常短,那麼這個函數調用產生的額外開銷和函數本身執行的時間相比,就顯得不能忽略瞭。假如這樣的函數在一個循環中被上千萬次地執行,函數調用導致的時間開銷可能就會使得程序運行明顯變慢。

作為特別註重程序執行效率,適合編寫底層系統軟件的高級程序設計語言,C++ 用 inline 關鍵字較好地解決瞭函數調用開銷的問題。

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

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

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

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

內聯函數中的代碼應該隻是很簡單、執行很快的幾條語句。如果一個函數較為復雜,它執行的時間可能上萬倍於函數調用的額外開銷,那麼將其作為內聯函數處理的結果是付出讓代碼體積增加不少的代價,卻隻使速度提高瞭萬分之一,這顯然是不劃算的。

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

另外,需要註意的是,調用內聯函數的語句前必須已經出現內聯函數的定義(即整個數體),而不能隻出現內聯函數的聲明。

到此這篇關於C++ 內聯函數inline案例詳解的文章就介紹到這瞭,更多相關C++ 內聯函數inline內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: