2010-07-15 12 views
11

Al compilar C++ con GCC 4.4 o MSVC, ¿es posible hacer que el compilador emita mensajes cuando una función está en línea?Averiguar qué funciones estaban en línea

+0

Buena pregunta, pero estoy curioso en cuanto a sus motivos. – Daniel

+0

Reestructurar el código moviendo una gran cantidad de código desde el encabezado a los archivos cpp y ahora se ejecuta más lento. Quiero ver si hay diferencia en el número de funciones en línea –

+0

¿Cómo está construyendo? ¿Liberar o depurar? ¿Qué estás especificando para/OPT para Visual Studio? –

Respuesta

2

con g ++, no creo que usted puede hacer g ++ informe de eso, sino que se puede examinar el binario resultante con cualquier herramienta que muestra los símbolos, nm por ejemplo:

#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 

(sin salida desde nm en el segundo caso)

EDIT: Además, los perfiladores pueden ser útiles. gprof muestra, en estos dos ejemplos:

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, dependiendo de cómo se usan las funciones, el compilador puede alinear algunas instancias y no otros Si el programa es lo suficientemente grande, sería necesario algo más sofisticado. – Cogwheel

+0

De hecho. Me pregunto si los perfiladores informan algo así (gprof no parece). Podría ser una pequeña herramienta útil para escribir. – Cubbi

+0

Gracias. Puedo ver diferencias en los binarios compilados. La única versión del encabezado parece haber incorporado más funciones. Corrí en gprof antes (compilado con -pg) y no pude encontrar muchas diferencias entre los dos. Acabo de ejecutar los programas en callgrind y la única versión del encabezado parece haber sido insertada en muchas funciones, ya que no aparecen en el resultado de callgrinds. –

Cuestiones relacionadas