2013-05-05 19 views

risposta

5

Il collegamento di un nome non ha nulla a che fare con dove o come viene definito, solo con il nome che può essere utilizzato per fare riferimento a un particolare oggetto o funzione.

Dichiarare una funzione in linea non forzarla in linea; semplicemente rilassa la regola di una definizione per consentire una definizione in ciascuna unità di traduzione in cui viene utilizzata (e ne richiede una in ciascuna unità di traduzione in cui è chiamata), per semplificare l'allineamento. Non impedisce la generazione di una versione non in linea, se il compilatore decide di non effettuare la chiamata in linea specifica o se ne prende l'indirizzo.

Quindi "collegamento esterno" e "in linea" non sono esclusivi; "collegamento esterno" significa che la funzione può essere riferita a qualsiasi unità di traduzione e "in linea" significa che deve essere definita in qualsiasi unità di traduzione che la chiama.

0

Forse un modo migliore per esprimerlo è "Se il collegamento è necessario, sarà esterno". Significato, se si prende l'indirizzo della funzione inline, quell'indirizzo sarà visibile esternamente (non statico per un modulo).

0

Le funzioni inline non sono necessariamente espanse in linea. Quando non lo sono, la definizione della lingua richiede che ci sia solo una copia della funzione.

0

Le funzioni in linea sono in genere "collegabili" da altre unità di compilazione. Non appariranno come funzioni inline. C'è una copia della funzione nel file compilato. Questo vale per le funzioni inline gratuite. Le funzioni dei membri della classe non ottengono, in genere, una copia della funzione per l'utilizzo "non in linea". I linker validi rimuovono anche il codice come "codice morto" se non viene mai sottoposto a un nuovo riferimento.

Problemi correlati