2010-07-15 14 views
11

Quando si compila C++ con GCC 4.4 o MSVC è possibile far sì che il compilatore emetta dei messaggi quando una funzione è in linea?Scopri quali funzioni sono state allineate

+0

Buona domanda ma io sono curioso di sapere le vostre motivazioni. – Daniel

+0

Ho ri-strutturato il codice spostando un sacco di codice dall'intestazione ai file cpp e ora viene eseguito più lentamente. Voglio vedere se c'è una differenza nel numero di funzioni inlining –

+0

Come stai costruendo? Rilascio o debug? Cosa stai specificando per/OPT per Visual Studio? –

risposta

2

Con g ++, non credo che si può fare g ++ rapporto che, ma è possibile esaminare il file binario risultante con qualsiasi strumento che mostra i simboli, nm per esempio:

#include <iostream> 
struct T { 
     void print() const; 
}; 
void T::print() const { std::cout << " test\n" ; } 
int main() 
{ 
     T t; 
     t.print(); 
} 

~ $ g++ -O3 -Wall -Wextra -pedantic -o test test.cc 
~ $ nm test | grep print 
0000000000400800 t _GLOBAL__I__ZNK1T5printEv 
0000000000400830 T _ZNK1T5printEv 

vs

#include <iostream> 
struct T { 
     void print() const { std::cout << " test\n" ; } 
}; 
int main() 
{ 
     T t; 
     t.print(); 
} 
~ $ g++ -O3 -Wall -Wextra -pedantic -o test test.cc 
~ $ nm test | grep print 

(nessuna uscita da nm nel secondo caso)

MODIFICA: Inoltre, i profiler possono essere utili. gprof mostra, su questi due esempi:

0.00  0.00  0.00  1  0.00  0.00 global constructors keyed to _ZNK1T5printEv 
0.00  0.00  0.00  1  0.00  0.00 T::print() const 

vs. solo

0.00  0.00  0.00  1  0.00  0.00 global constructors keyed to main 
+5

FWIW, a seconda di come vengono utilizzate le funzioni, il compilatore può incorporare alcune istanze e non altri. Se il programma è sufficientemente grande, sarebbe necessario qualcosa di più sofisticato. – Cogwheel

+0

Infatti. Mi chiedo se qualche profiler abbia riportato qualcosa del genere (gprof non sembra). Potrebbe essere un piccolo strumento utile da scrivere. – Cubbi

+0

Grazie. Riesco a vedere le differenze nei binari compilati. La versione solo dell'intestazione sembra avere più funzioni inline. Ho eseguito gprof prima (compilato con -pg) e non potevo avere molte differenze tra i due. Ho appena eseguito i programmi su callgrind e la sola versione dell'intestazione sembra avere un numero elevato di funzioni in quanto non vengono visualizzate nell'output di callgrinds. –

Problemi correlati