2009-04-02 5 views
7

Fino a qualche tempo fa il mio codice base era molto vicino a #include inferno. Ogni volta che ho modificato un file .h leggermente importante, praticamente tutti i file sono stati ricompilati.
Il motivo principale per una tale elevata percentuale di intestazioni è che ho molte piccole funzioni che devono essere in linea e avevo l'impressione che per essere in linea debbano essere nella stessa unità di traduzione del codice chiamante, quindi hanno bisogno essere nell'intestazione. Per la funzione inline per compilare anche altre intestazioni devono essere incluse anche nell'intestazione, ad estrema importanza.C++: funzioni inline e generazione del codice di tempo di collegamento

Immettere link-time code generation (in Visual Studio). Uno dei principali vantaggi dichiarati è che ora la funzione in linea può attraversare le unità di traduzione.
Ma sono ancora incerto. Come posso essere davvero sicuro che queste funzioni vengano davvero sottolineate? Mi rendo conto che il compilatore può fare praticamente qualsiasi cosa diavolo voglia, non importa dove definisco la funzione.

C'è un modo per controllare cosa viene inserito?

+0

Perché è così essenziale che queste funzioni siano in linea? Sembra strano Di solito, si desidera che le funzioni siano in linea * quando ne beneficiano le prestazioni *, che il compilatore è in genere più in grado di determinare rispetto a – jalf

+0

@ Rüdiger Stevens - In realtà, è possibile. Controlla l'opzione ': PGINSTRUMENT' di VC++ sul flag/LTCG. http://msdn.microsoft.com/en-us/library/xbf3tbeh%28VS.80%29.aspx –

risposta

1

Una volta ottenuto l'eseguibile, è possibile utilizzare gli strumenti per ispezionarlo e cercare i nomi delle funzioni integrate nelle tabelle dei simboli. Uno di questi strumenti che è molto utile è Dependency Walker.

Questo ovviamente presuppone che sia possibile ottenere una build che combina sia impostazioni di ottimizzazione sufficienti per il compilatore da disturbare con l'inlining, mantenendo i simboli.

Per Visual Studio, penso che le build "Release" corrispondano spesso a quelle, ma non ne sono del tutto sicuro.

+1

I simboli di trattenimento non rappresentano un problema con le informazioni di debug e le ottimizzazioni attivate, ma una funzione può essere allineata in un punto, e non dall'altra. –

+0

Il walker delle dipendenze elenca solo le funzioni esportate e importate.Supponendo che io abbia simboli, come posso ottenere un elenco testuale al di fuori di esso? – shoosh

+0

Oops, mio ​​male, non me ne ero reso conto. Forse questa porta dello strumento Unix 'nm' fa il trucco: . – unwind

3

Sicuramente non ti interessa davvero se le cose si inarcano - ti interessa solo se le prestazioni sono soddisfacenti. Ma se vuoi davvero scoprirlo, esamina il codice generato dal compilatore. Puoi farlo più facilmente tramite il debugger, usando una finestra di visualizzazione assembler.

3

Non si può mai essere sicuri che le funzioni siano in linea. Spetta al compilatore sceglierlo. Ma puoi renderlo più facile per il compilatore permettendogli di trovare il codice oggetto associato alla funzione.

Ecco dove arriva la generazione del codice link-time. I compilatori non generano più codice oggetto, generano una forma di linguaggio intermedio ed è il linker che effettivamente compila il codice.

Per controllare ciò che viene sottolineato, temo che sia lasciato generare output di assieme con il codice dell'oggetto. Ciò consente di leggere l'esatto codice oggetto prodotto quando viene richiamata una determinata funzione e sarà molto chiaro se c'è una "chiamata" non presente.

3

Un modo relativamente semplice consiste nell'utilizzare un profiler. Se una funzione è in linea non la vedrai nel flusso del grafico di controllo.

7

So che è tabù in C++ per dirlo, ma è possibile implementare le funzioni come macro del preprocessore. Mi scusi mentre ora vado a lavarmi la bocca con il sapone.

+0

+1: Perché a volte è l'ultima possibilità di dire al compilatore di "in linea" la tua funzione se insiste assolutamente nel non definirla, anche se sai perfettamente che le prestazioni sarebbero migliori :-) – mmmmmmmm