跳轉到內容

C++ 程式設計

來自華夏公益教科書,開放書籍,開放世界

inline 關鍵字宣告一個行內函數,該宣告是對編譯器的(非強制性)請求,要求將特定函式進行 內聯擴充套件;也就是說,它建議編譯器在使用該函式的每個上下文中插入函式的完整主體,因此它用於避免透過從程式碼中的一個地方跳轉到另一個地方,然後再返回以執行子程式(如在子程式的樸素實現中所做的那樣)而產生的開銷。

inline swap( int& a, int& b) { int const tmp(b); b=a; a=tmp; }

當函式定義包含在類/結構體定義中時,它將是 *隱式內聯*,編譯器將嘗試自動內聯該函式。在這種情況下,不需要 inline 關鍵字;在該上下文中新增 inline 關鍵字是合法的,但冗餘的,並且 良好的風格 是省略它。

示例

struct length
{
  explicit length(int metres) : m_metres(metres) {}
  operator int&() { return m_metres; }
  private:
  int m_metres;
};

*內聯* 可以 是一種最佳化,也可以是一種悲觀最佳化。它可以增加程式碼大小(透過在多個呼叫站點複製函式的程式碼)或減少程式碼大小(如果函式的程式碼在最佳化後小於呼叫非行內函數所需的程式碼大小)。它可以提高速度(透過允許進行更多最佳化並避免跳轉)或降低速度(透過增加程式碼大小,從而導致快取未命中)。

內聯的一個重要副作用是,更多程式碼可供最佳化器訪問。

將函式標記為內聯還會影響連結:多個行內函數定義是允許的(只要每個定義都在不同的翻譯單元中)只要它們是相同的。這允許行內函數定義出現在標頭檔案中;在標頭檔案中定義非行內函數幾乎總是錯誤的(雖然函式模板也可以在標頭檔案中定義,並且通常會這樣做)。

主流 C++ 編譯器,如 Microsoft Visual C++GCC 支援一個選項,允許編譯器 *自動內聯* 任何合適的函式,即使是那些沒有標記為行內函數的函式。編譯器通常比人更能判斷某個特定函式是否應該內聯;特別是,編譯器可能不願意或不能內聯人要求它內聯的許多函式。

過度使用行內函數會大大增加耦合/依賴關係和編譯時間,還會使標頭檔案作為介面文件的效用降低。

華夏公益教科書