內嵌,__inline __forceinline
inline和__inline規範指示編譯器在呼叫此函式的每個位置中插入一份函式主體。
inline function_declarator;
__inline function_declarator; // Microsoft Specific
__forceinline function_declarator; // Microsoft Specific
備註
插入動作 (稱為內嵌展開或內嵌) 編譯器的成本/收益分析顯示要使它成為獲利時,才會發生。 內嵌展開可以減輕負荷在程式碼需要較大的潛在成本函式呼叫。
__forceinline關鍵字會覆寫 [成本/收益分析,而是依賴程式設計師的判斷。 使用時特別小心__forceinline。 任意使用__forceinline可產生較大的程式碼,以及只臨界的效能提升或,在某些情況下,甚至是效能損失 (增加分頁的較大的可執行檔,例如)。
使用內嵌函式可以使您的程式速度較快,因為它們,完全不需要耗用的函式呼叫。 內嵌函式展開有可能無法使用一般的函式的程式碼最佳化。
編譯器會將內嵌展開選項和關鍵字視同建議。 也不會保證函式一定會內嵌。 您無法強制編譯器內嵌特定的函式,即使有了__forceinline關鍵字。 編譯與時**/clr**,編譯器不會內嵌函式安全屬性套用至函式時。
內嵌關鍵字是只適用於 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;
}
類別的成員函式可以宣告為內嵌使用內嵌關鍵字或是藉由將函式定義的類別定義中。
範例 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,它會產生層級 1 警告。
遞迴函式可以是深度,以指定欲替代之的內嵌 inline_depth pragma,最多可有 16 呼叫。 之後該深度,遞迴函式呼叫會被視為呼叫函式的執行個體。 哪一個遞迴函式會檢查內嵌 heuristic 深度不能超過 16。 Inline_recursion pragma 控制內嵌展開目前在 [擴充] 下的函式。 請參閱內嵌函式展開 (/ Ob) 編譯器選項,如需相關資訊。
結束 Microsoft 特定
如需有關使用內嵌規範,請參閱: