C++
Funzioni inline
Ricerca…
introduzione
Una funzione definita con lo specificatore in inline
è una funzione inline. Una funzione inline può essere definita in modo multiplo senza violare la regola One Definition e può quindi essere definita in un'intestazione con linkage esterno. Dichiarare una funzione suggerisce inline al compilatore che la funzione debba essere sottolineata durante la generazione del codice, ma non fornisce una garanzia.
Sintassi
-
inline
function_declaration - funzione_definizione in
inline
- class {function_definition};
Osservazioni
Di solito se il codice generato per una funzione è sufficientemente piccolo, allora è un buon candidato essere in linea. Perchè così? Se una funzione è di grandi dimensioni ed è racchiusa in un ciclo, per tutte le chiamate effettuate, il codice della funzione di grandi dimensioni verrebbe duplicato, con conseguente aumento delle dimensioni del file binario generato. Ma quanto è piccolo?
Mentre le funzioni inline sembrano essere un ottimo modo per evitare il sovraccarico della funzione, è necessario notare che non tutte le funzioni contrassegnate in inline
sono inline. In altre parole, quando si dice in inline
, è solo un suggerimento per il compilatore, non un ordine: il compilatore non è obbligato a incorporare la funzione, è libero di ignorarlo - molti di loro lo fanno. I compilatori moderni sono più bravi a rendere tali ottimizzazioni che questa parola chiave è ormai una traccia del passato, quando questo suggerimento della funzione di inlining da parte del programmatore è stato preso sul serio dai compilatori. Anche le funzioni non marcate in inline
sono delineate dal compilatore quando ne vede i benefici.
In linea come direttiva di collegamento
L'uso più pratico di inline
nel C ++ moderno deriva dal suo utilizzo come direttiva di collegamento. Quando si definisce , non dichiarando, una funzione in un'intestazione che verrà inclusa in più fonti, ciascuna unità di traduzione avrà la propria copia di questa funzione che porta a una violazione ODR (One Definition Rule); questa regola dice approssimativamente che può esserci solo una definizione di una funzione, una variabile, ecc. Per aggirare questa violazione, contrassegnando la definizione della funzione inline
implicitamente rende il collegamento della funzione interno.
FAQs
Quando dovrei scrivere la parola chiave "inline" per una funzione / metodo in C ++?
Solo quando si desidera definire la funzione in un'intestazione. Più esattamente solo quando la definizione della funzione può essere visualizzata in più unità di compilazione. È una buona idea definire funzioni piccole (come in un liner) nel file di intestazione in quanto fornisce al compilatore maggiori informazioni su cui lavorare mentre ottimizza il codice. Aumenta anche il tempo di compilazione.
Quando non dovrei scrivere la parola chiave 'inline' per una funzione / metodo in C ++?
Non aggiungere in inline
quando pensi che il tuo codice verrà eseguito più velocemente se il compilatore lo indicherà.
Quando il compilatore non saprà quando eseguire una funzione / metodo in linea?
Generalmente, il compilatore sarà in grado di farlo meglio di te. Tuttavia, il compilatore non ha l'opzione per il codice inline se non ha la definizione della funzione. Nel codice ottimizzato di solito tutti i metodi privati sono in linea se lo chiedi o no.
Guarda anche
Dichiarazione di funzione inline non membro
inline int add(int x, int y);
Definizione della funzione inline non membro
inline int add(int x, int y)
{
return x + y;
}
Funzioni inline dei membri
// header (.hpp)
struct A
{
void i_am_inlined()
{
}
};
struct B
{
void i_am_NOT_inlined();
};
// source (.cpp)
void B::i_am_NOT_inlined()
{
}
Qual è la funzione di inlining?
inline int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 1, b = 2;
int c = add(a, b);
}
Nel codice precedente, quando add
è in linea, il codice risultante diventerebbe qualcosa di simile
int main()
{
int a = 1, b = 2;
int c = a + b;
}
La funzione inline non si vede da nessuna parte, il suo corpo viene inserito nel corpo del chiamante. Era add
non è stato inline, una funzione sarebbe chiamato. L'overhead di chiamare una funzione, come la creazione di un nuovo stack frame , la copia di argomenti, la creazione di variabili locali, il salto (perdita della località di riferimento e là da errori di cache), ecc., Devono essere sostenuti.