共用方式為


inline、__inline、__forceinline

inline 和 __inline 的指定名稱會指引編譯器插入一份函式主體的拷貝到任何有呼叫函式的地方。

inline function_declarator;   
__inline function_declarator;   // Microsoft Specific
__forceinline function_declarator;   // Microsoft Specific

備註

插入 (稱為內嵌展開或內嵌) 動作只發生在編譯器的成本/效益分析中是有利的。 內嵌展開減輕函式呼叫在潛在消耗程式碼大小上。

__forceinline 關鍵字覆寫成本/效益分析並依靠程式設計人員的判斷。 練習時小心 __forceinline 的使用。 對 __forceinline 的不加已分別可能會導致只得到最低效能或,在某些情況下,根本沒有效能 (例如因為較大型執行檔的分頁增加)。

使用內嵌函式可以讓程式更快速,因為它們不需要額外負荷與函式呼叫。 函式展開為內嵌是以程式碼最佳化為條件但不適用於普通函式。

編譯器會將內嵌展開選項和關鍵字視同建議。 並不保證函式一定會內嵌。 您無法強制編譯器內嵌特定的函式,即使是使用 __forceinline 關鍵字。 在編譯 /clr時,如果含有安全性屬性套用至此函式,則編譯器不會內嵌函式。

inline 關鍵字只適用於 C++。 __inline 與 __forceinline 關鍵字可在 C 和 C++。 為了與舊版相容,_inline是 __inline 的同義字。

inline 關鍵字會指示編譯器內嵌展開為慣用。 不過,您可以建立函式的個別執行個體 (具現化) 和建立標準呼叫連接的編譯器而不是將程式碼內嵌。 這可能發生的兩種情況:

  • 遞迴函式。

  • 透過指標在其他地方參考在這個轉譯單位中的函式。

這些原因可能干擾內嵌, 像其他憑證編譯器的流程;您不應依賴 內嵌 規範名稱去造成函式內嵌。

與一般功能不同點在於,已經沒有定義的順序,此順序為對內嵌函式的引數評估。 實際上,它可以是不同在順序上,此順序的參數在使用普通涵是呼叫協定時已被評估。

/Ob 編譯器最佳化選項可協助判斷內嵌函式展開是否確實發生。

/LTCG 中執行跨模組的內嵌,不論是否在原始程式碼中有無被要求。

範例 1

// inline_keyword1.cpp
// compile with: /c
inline int max( int a , int b ) {
   if( a > b ) 
      return a;
   return b;
}

類別的成員函式可以宣告內嵌藉由 inline 關鍵字的使用或透過放置在類別定義中的函式定義。

範例 2

// inline_keyword2.cpp
// compile with: /EHsc /c
#include <iostream>
using namespace std;

class MyClass {
public:
   void print() { cout << i << ' '; }   // Implicitly inline
private:
   int i;
};

Microsoft 專有的

__inline 關鍵字相當於 內嵌

儘管使用 __forceinline,編譯器仍無法在所有情況下內嵌程式碼。 編譯器無法內嵌一個函式當:

  • 函式或它的呼叫端使用 /Ob0 編譯 (預設選項為偵錯組建)。

  • 函式和呼叫端使用不同的例外狀況處理 (C++ 用一種,其他結構化例外處理又是另一種 ) 。

  • 具有變數引數清單的函式。

  • 函式使用內嵌組譯碼,,除非編譯使用 /Og、/Ox、/O1 或 /O2。

  • 函式是遞迴且不由 **#pragma inline_recursion(on)**所伴隨。 伴隨 Pragma,遞迴函式內嵌至預設為 16 個呼叫的深度。 若要減少內嵌的呼叫深度,請使用 inline_depth pragma。

  • 函式是虛擬的也是以虛擬地呼叫。 對虛擬函式的直接呼叫可以內嵌。

  • 程式使用函式的位址,而且此呼叫是透過指標至函式進行的。 要取得其位址拍攝之函式的呼叫可以內嵌。

  • 函式也可以標記 naked __declspec 之修飾詞。

如果編譯器無法內嵌以 __forceinline宣告的函式 ,它會產生層級一的警告。

遞迴函式可以被替代內嵌到 inline_depth 所指定的深度,Pragma 指定的深度最多可達 16 個呼叫。 該深度之後,函式呼叫視為函式執行個體的呼叫。遞迴函式由內嵌啟發學習法所檢查且其深度不能超過 16。 inline_recursion pragma 控制一個正在擴張的內嵌函式。 提供相關資訊 (請參閱 內嵌函式展開 /Ob (英文) 編譯器選項。

END Microsoft 專有

如需有關使用 [內嵌] 視窗的詳細資訊,請參閱:

請參閱

參考

C++ 關鍵字

noinline

auto_inline