2015-01-19 15 views
5

Ho spesso sentito dire che è una cattiva pratica inserire codice nell'intestazione, ma è stato comune posizionare brevi funzioni nelle intestazioni, in parte per aiutare il compilatore a ottimizzare meglio.Un compilatore C/C++ moderno può ottimizzare meglio con il codice nell'intestazione?

Le parole chiave inline possono aiutare il compilatore a determinare quali funzioni devono essere sottolineate, ma a parte questo, c'è ancora un motivo per avere funzioni critiche per le prestazioni brevi nelle intestazioni? O non importa più per i compilatori moderni?

+1

Quando si include un file di intestazione, il preprocessore copia e incolla letteralmente il codice nel punto in cui è stato inserito. – Andrew

+0

Ti suggerisco di dare un'occhiata qui: http://programmers.stackexchange.com/questions/180904/are-header-files-actually-good –

+1

'inline' per lo più non significa" rendere questo codice in linea "in C++ , ha più a che fare con la risoluzione delle collisioni dei nomi dei tempi di collegamento. "Mettere il codice in linea" ha poco significato nel contesto dello standard C++. – Yakk

risposta

4

Tecnicamente, la parola chiave inline significa solo che la definizione è consentita in più unità di traduzione. Cioè, se hai una funzione inline definita in un file di intestazione e quell'intestazione viene inclusa in più file sorgente, allora va bene. Per una funzione non in linea, non modello, sarebbe illegale.

Ma i compilatori possono sfruttare la possibilità di vedere il codice della funzione chiamata. Ciò accade non solo per le funzioni inline ma anche per tutte le altre funzioni il cui codice può essere visibile. Molti compilatori cercano di fare una buona ipotesi sull'integrazione del codice. Avere il codice in linea potrebbe rendere il programma più grande o più piccolo, più veloce o più lento. Se il compilatore può determinare che il codice sia probabilmente più veloce e più piccolo quando il codice è in linea, lo farà. Altrimenti deve considerare il trade-off.

Molti compilatori moderni possono eseguire l'ottimizzazione del collegamento in tempo reale, in cui il codice che non era stato inizializzato per iniziare può essere sottolineato durante la fase di collegamento, con un certo costo nel tempo di collegamento. Potrebbero esserci alcune opportunità di ottimizzazione che vengono perse se ritardate fino al momento della connessione.

Nella mia esperienza personale, ho scoperto che la realizzazione di piccole funzioni in linea è sempre una vittoria per dimensioni e velocità. Per le funzioni più grandi, vedo spesso che rende i programmi più veloci ma più grandi, ma ho anche visto raramente rendere i programmi più lenti e più grandi. Se le prestazioni di una particolare funzione sono importanti, è necessario effettuare misurazioni per aiutare a scegliere se allineare o meno.

+0

Buone informazioni. Il pezzo chiave qui per me è che "i compilatori possono e trarre vantaggio dal poter vedere il codice della funzione che viene chiamata", e questo è vero anche con l'ottimizzazione link-time/whole-program.Avevo sperato di occuparmi di questo solo tenendo a mente la leggibilità, ma quello che dici ha un senso, e come al solito non sembra esserci alcun rimpiazzo per l'effettivo benchmarking. Grazie mille! –

Problemi correlati