2010-09-06 17 views
8

Vale la pena utilizzare la parola chiave inline o il compilatore è abbastanza intelligente da sapere quando deve integrare una funzione?C: vale la parola chiave inline?

+4

Un'osservazione non vale una risposta: se non si intende utilizzare la funzione dall'unità di compilazione in cui si trova, la parola chiave "statico" fa più per aiutare il compilatore che "in linea". Il compilatore può quindi, ad esempio, inline indipendentemente dalle dimensioni se esiste un sito di una singola chiamata. –

risposta

9

Il compilatore è piuttosto intelligente e ha più parametri per capire se qualcosa vale la pena di essere integrato. Ma a volte però lo sviluppatore avrà una conoscenza su come l'applicazione verrà eseguita e saprà di incorporare qualcosa che il compilatore non esegue automaticamente. Tuttavia, non avrei mai inserito le cose in linea manualmente a meno che non avessi fatto alcuni benchmark e ho scoperto che in linea avrei migliorato le mie prestazioni.

Ulteriori informazioni su come GCC uses inline.

3

Vale sempre la pena essere espliciti sull'intenzione.

Vale anche la pena notare che il compilatore non ha nemmeno bisogno di inline se pensa che sia meglio non troppo.

13

Sì, è abbastanza intelligente. Ma ciò che non ha fatto alcun progresso negli ultimi 40 anni è il modo in cui i programmi C sono costruiti. È ancora un file di codice sorgente alla volta.

Quindi per ottenere una funzione inline in più di un file .c, si inserisce la definizione della funzione nel file .h. E se non li contrassegni in linea, il linker si lamenterà delle molteplici definizioni.

+2

+1, 'inline' al giorno d'oggi significa" consentire più definizioni ". Il fatto che sia anche un suggerimento al compilatore di "rendere la chiamata rapida a questa funzione" è un effetto collaterale non correlato e irrilevante :-) Penso che non sia "il modo in cui i programmi sono costruiti" non è avanzato - alcuni compilatori/linker avere. Ma il minimo comune denominatore, che lo standard consente, non è avanzato. –

+9

Dire "in linea" significa "consentire più definizioni" è semplicemente sbagliato. Questa domanda riguarda il linguaggio C, non il C++. C non ha le funzioni '' esternamente inline', la parola chiave 'inline' non è valida senza' static', e non sono mai consentite più definizioni di una funzione. –

0

Lo Standard dice

7.1.2 Funzione specifiche dell'avvio

2.   una dichiarazione di funzione (8.3.5, 9.3, 11.4) con un identificatore inline dichiara una funzione inline. Lo specificatore in linea indica all'implementazione che la sostituzione in linea del corpo della funzione nel punto di chiamata deve essere preferita al solito meccanismo di chiamata di funzione. Non è richiesta un'implementazione per eseguire questa sostituzione in linea al punto di chiamata; tuttavia, anche se questa sostituzione inline viene omessa, le altre regole per le funzioni inline definite da 7.1.2 devono comunque essere rispettate.

Così mi paragono inline a forse <br /> in HTML - è buona pratica di utilizzare l'auto-chiusura <br /> tutto il tempo. Ma si potrebbe obiettare che quasi tutte le implementazioni del browser trattano lo <br> e lo <br /> esattamente lo stesso, che IMO perde il punto.

Come altri hanno notato, questo probabilmente non è molto rilevante per il valore delle prestazioni in questi giorni. Ma penso che funzioni ancora bene come una parola semantica che trasmette intenzionalmente.