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
risposta
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
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
Infatti. Mi chiedo se qualche profiler abbia riportato qualcosa del genere (gprof non sembra). Potrebbe essere un piccolo strumento utile da scrivere. – Cubbi
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. –
Buona domanda ma io sono curioso di sapere le vostre motivazioni. – Daniel
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 –
Come stai costruendo? Rilascio o debug? Cosa stai specificando per/OPT per Visual Studio? –