inline, __inline, __forceinline

inline e __inline gli identificatori base al compilatore di inserire una copia del corpo della funzione in ogni punto in cui viene chiamata la funzione.

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

Note

L'inserimento denominato l'espansione inline o inline) si verifica solo se viene illustrato il costo/tracciatura dei benefici del compilatore per essere preferibile.L'espansione inline allevia il sovraccarico di chiamata di funzione al costo potenziale di dimensione massima di codice.

__forceinline la parola chiave esegue l'override del costo/tracciatura dei benefici e si basa sul giudizio del programmatore anziché.Attenzione di esercizio caso di utilizzo __forceinline.Utilizzo di indiscriminante __forceinline può provocare il più grande codice con solo aumenti di prestazioni marginali o, in alcuni casi, anche le perdite di prestazioni (a causa di paging elevato di più grande eseguibile, ad esempio.

Utilizzo delle funzioni inline può rendere il programma più veloce perché eliminare il sovraccarico associato alle chiamate di funzione.Le funzioni hanno espanso inline sono soggetti alle ottimizzazioni di codice non disponibili per le funzioni normali.

Il compilatore considera le parole chiave e le opzioni dell'espansione inline come suggerimenti.Non è garantito che le funzioni saranno inline.Non è possibile forzare il compilatore da inline una particolare funzione, anche se con __forceinline parola chiave.Durante la compilazione con /clr, il compilatore non inline una funzione eventuali attributi di sicurezza applicati alla funzione.

inline la parola chiave è disponibile solo in C++.__inline e __forceinline le parole chiave sono disponibili sia in C che in C++.Per garantire la compatibilità con le versioni precedenti, _inline è sinonimo di __inline.

inline la parola chiave indica al compilatore che l'espansione inline è preferibile.Tuttavia, il compilatore può creare un'istanza separata della funzione (creare un'istanza di) e creare i collegamenti chiamante standard invece di inserire il codice inline.Due casi in cui questo può verificarsi sono:

  • funzioni ricorsive.

  • Funzioni che fanno riferimento a tramite un puntatore nell'unità di conversione.

Questi motivi possono interferire con l'inlining, come possibile altri, a discrezione del compilatore, non deve dipendere da inline identificatore per forzare una funzione venga inline.

Come con le funzioni normali, non esiste un ordine definito valutazione degli argomenti di una funzione inline.Infatti, può essere diverso dall'ordine in cui gli argomenti vengono valutati una volta passati utilizzando il protocollo normale di chiamata di funzione.

/Ob l'opzione di ottimizzazione del compilatore consente di determinare se l'espansione di funzione inline in realtà si verifica.

/LTCG esegue inline intramodulo indipendentemente dal fatto che è stato richiesto nel codice sorgente.

Esempio 1

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

Le funzioni membro di una classe possono essere dichiarati inline utilizzando inline parola chiave o inserendo la definizione di funzione nella definizione della classe.

Esempio 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;
};

Specifici di Microsoft

__inline la parola chiave è equivalente a inline.

anche con __forceinline, il compilatore non è in grado di codice inline in tutti i casi.Il compilatore non è in grado di rendere inline una funzione se:

  • La funzione o il relativo chiamante viene compilata con /Ob0 (l'opzione predefinita per le compilazioni di debug.

  • La funzione e il chiamante utilizzati tipi diversi di gestione delle eccezioni (gestione delle eccezioni C++ in una, gestione delle eccezioni strutturata nell'altra).

  • La funzione contiene un elenco di argomenti variabile.

  • La funzione utilizza l'assembly inline, a meno che non venga compilato con /Og, /Ox, /O1, o /O2.

  • La funzione è ricorsiva e di accompagnamento da inline_recursion #pragma (tramite).Con il pragma, le funzioni ricorsive sono inline per un numero predefinito di 16 chiamate.Per ridurre il livello inline, utilizzare inline_depth pragma.

  • La funzione è virtuale e viene chiamata di.Le chiamate dirette alle funzioni virtuali possono essere inline.

  • Il programma accetta l'indirizzo della funzione e la chiamata viene effettuata tramite il puntatore a funzione.Le chiamate dirette alle funzioni che avevano relativo indirizzo intraprendere possono essere inline.

  • La funzione viene contrassegnata con naked __declspec modificatore.

Se il compilatore non è in grado di rendere inline una funzione dichiarata con __forceinline, genera un avviso di Livello 1.

Le funzioni ricorsive possono essere inline sostituito a una profondità specificata da inline_depth pragma, fino a un massimo di 16 chiamate.Dopo la profondità, chiamate di funzioni ricorsive viene considerata come chiamate a un'istanza della funzione.La profondità con cui le funzioni ricorsive vengono esaminate come l'euristico inline non può superare i 16.inline_recursion il pragma attualmente controlla l'espansione inline di una funzione con espansione.vedere Espansione delle funzioni inline opzione del compilatore (/Ob) per informazioni correlate.

Microsoft FINALE specifico

Per ulteriori informazioni sull'utilizzo inline l'identificatore, vedere:

Vedere anche

Riferimenti

Parole chiave C++

noinline

auto_inline