Condividi tramite


inline, __inline, __forceinline

Gli identificatori inline e __inline indicano al compilatore di inserire una copia del codice della funzione in ogni punto in cui la funzione stessa viene richiamata.

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

Note

L'inserimento (denominato espansione inline o inlining) si verifica solo se l'analisi del compilatore di costo/beneficio si dimostra profittevole. L'espansione inline allevia l'overhead delle chiamate di funzione al costo potenziale di una maggiore lunghezza del codice.

La parola chiave __forceinline sostituisce l'analisi di costo/beneficio e fa affidamento al giudizio del programmatore. Usare cautela quando si utilizza __forceinline. L'utilizzo indiscriminato di __forceinline può rendere il codice più grande con solo marginale guadagno di prestazioni, o in alcuni casi, addirittura con perdita di prestazioni (a causa, ad esempio, di paging elevato di un più grande file eseguibile).

L'utilizzo di funzioni inline può rendere il programma più veloce perché elimina il sovraccarico associato alle chiamate di funzione. Le funzioni espanse con inline sono soggette a 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 siano sottoposte all'espansione inline. Non è possibile forzare il compilatore ad espandere con inline una data funzione, anche con la parola chiave __forceinline. Durante la compilazione con /clr, il compilatore non eseguirà l'inline di una funzione se esistono eventuali attributi di sicurezza applicati alla funzione.

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

La parola chiave inline indica al compilatore che l'espansione inline è preferibile. Tuttavia, il compilatore può creare un'istanza separata della funzione (istanziare) e creare collegamenti standard di chiamate piuttosto che inserire il codice inline. Due casi in cui ciò può verificarsi sono:

  • Funzioni ricorsive.

  • Funzioni a cui si fa riferimento tramite un puntatore in un punto diverso dell'unità di traslazione.

Questi motivi, come anche altri, possono interferire con l'inline a discrezione del compilatore; non deve dipendere dall'identificatore inline la forzatura dell'espansione inline di una funzione.

Analogamente alle funzioni normali, non è definito alcun ordine di 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.

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

/LTCG esegue l'operazione di inline intramodulo indipendentemente dal fatto che sia stata richiesta 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 dichiarate inline utilizzando la parola chiave inline 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

La parola chiave __inline è equivalente a inline in SQL.

Anche se con __forceinline, il compilatore non è in grado di incorporare codice in qualsiasi circostanza. Il compilatore non espande inline una funzione se:

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

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

  • La Funzione ha 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 non è accompagnata da #pragma inline_recursion(on). Con il pragma, le funzioni ricorsive sono espanse inline a una profondità predefinita di 16 chiamate. Per ridurre il livello di inline, utilizzare il pragma inline_depth.

  • La funzione è virtual e viene chiamata virtualmente. Chiamate dirette alle funzioni virtual possono essere inline.

  • Il programma utilizza l'indirizzo della funzione e la chiamata viene effettuata tramite il puntatore alla funzione. Chiamate dirette alle funzioni che avevano relativo indirizzo possono essere inline.

  • La funzione viene contrassegnata con il modificatore naked __declspec.

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 sostituite inline a una profondità specificata dal pragma inline_depth, fino a un massimo di 16 chiamate. Dopo la profondità, chiamate di funzioni ricorsive vengono considerate come chiamate a un'istanza della funzione. La profondità con cui le funzioni ricorsive vengono valutate dall'euristica inline non può superare 16. Il pragma inline_recursion controlla l'espansione inline di una funzione attualmente in espansione. Vedere l'opzione del compilatore Espansione delle funzioni inline (/Ob) per informazioni correlate.

Specifica END Microsoft

Per ulteriori informazioni sull'utilizzo dell'identificatore inline, vedere .

Vedere anche

Riferimenti

Parole chiave C++

noinline

auto_inline