inline
fa due cose:
- ti dà una deroga alla "una regola definizione" (vedi sotto). Questo si applica sempre a.
- Fornisce al compilatore un suggerimento per evitare una chiamata di funzione. Il compilatore è libero di ignorarlo.
# 1 Può essere molto utile (ad esempio, inserire la definizione nell'intestazione se breve) anche se # 2 è disabilitato.
In pratica i compilatori eseguono spesso un lavoro migliore per capire cosa incorporare da soli (specialmente se è disponibile l'ottimizzazione guidata dal profilo).
[EDIT: riferimenti completi e rilevanti del testo]
I due punti di cui sopra entrambi seguono dallo standard ISO/ANSI (ISO/IEC 9899: 1999 (E), comunemente noto come "C99") .
In §6.9 "Definizione esterno", comma 5:
Un definizione esterna è una dichiarazione esterna che è anche una definizione di una funzione (diverso da una definizione di linea) o di un oggetto. Se un identificatore dichiarato con collegamento esterno viene utilizzato in un'espressione (diversa da come parte dell'operando di un operatore sizeof il cui risultato è una costante intera), da qualche parte nell'intero programma ci deve essere esattamente una definizione esterna per l'identificatore; altrimenti, non ci deve essere più di uno.
Mentre la definizione equalivalente in C++ viene esplicitamente denominata One Definition Rule (ODR) serve allo stesso scopo. Gli esterni (vale a dire non "statici", e quindi locali per una singola unità di traduzione - tipicamente un singolo file sorgente) possono essere definiti solo una volta a meno che sia una funzione e in linea.
In §6.7.4, "Funzione specificatori", la parola chiave inline è definito:
facendo una funzione una funzione inline suggerisce che chiama alla funzione essere veloce possibile. [118] La misura in cui tali suggerimenti sono efficaci è definita dall'implementazione .
E nota (non normativo), ma fornisce chiarimenti:
Utilizzando, ad esempio, in alternativa al meccanismo di chiamata di funzione usuale, come ‘‘linea di sostituzione’’. La sostituzione in linea non è una sostituzione testuale, né crea una nuova funzione. Pertanto, ad esempio, l'espansione di una macro utilizzata all'interno del corpo della funzione utilizza la definizione che aveva nel punto in cui appare il corpo della funzione e non dove viene chiamata la funzione; e gli identificatori si riferiscono alle dichiarazioni di portata in cui si trova il corpo. Allo stesso modo, la funzione ha un unico indirizzo, indipendentemente dal numero di definizioni in linea che si verificano in aggiunta alla definizione esterna.
Riepilogo: ciò che la maggior parte degli utenti di C e C++ si aspettano da in linea non è quello che ottengono. Il suo apparente scopo primario, per evitare l'overhead di chiamata funzionale, è completamente opzionale. Ma per consentire la compilazione separata, è necessario un allentamento della definizione singola.
(Tutti enfasi nelle citazioni dallo standard.)
EDIT 2: Alcune note:
- Ci sono varie restrizioni sulle funzioni inline esterni. Non è possibile avere una variabile statica nella funzione e non è possibile fare riferimento a oggetti/funzioni dell'oscilloscopio TU statico.
- Appena visto su VC++ "whole program optimisation", che è un esempio di un compilatore che fa la propria cosa inline, piuttosto che l'autore.
Sospetto che proprio come "registro" sia diventato obsoleto alla fine degli anni '80, "in linea" è obsoleto da diversi anni. –
\ o /, muori "in linea"! – elmarco
Inline non è sicuramente obsoleto. Hai mai letto il codice sorgente per un kernel moderno? Inline è irrilevante per le persone che scrivono applicazioni, ma quelle persone non dovrebbero usare C al giorno d'oggi in ogni caso, ed è altrettanto rilevante per la programmazione dei sistemi come sempre. – nosatalian