2010-12-15 17 views
31

hay una manera de conocer el código crea una instancia del compilador para una función de plantilla o de una clase en C++¿Podemos ver la plantilla de una instancia de código de compilador de C++

Supongamos que tengo el siguiente fragmento de código

template < class T> T add(T a, T b){ 
      return a+b; 
} 

ahora cuando llamo

add<int>(10,2); 

me gustaría saber la función que compilador crea para la versión específica int.

Estoy usando G ++, VC++. Será útil si algunos me pueden ayudar a señalar las opciones del compilador para lograr esto.

Espero que la pregunta sea clara. Gracias por adelantado.

+2

¿Desea ver la función en C++ o en ensamblaje? Si está en ensamblaje, use 'g ++ -S'. – Job

+2

Una pregunta estrechamente relacionada: http://stackoverflow.com/q/4332286/57428 – sharptooth

Respuesta

17

Definitivamente puede ver el código de ensamblaje generado por el g ++ usando la opción "-S".

No creo que sea posible mostrar el código de plantilla equivalente "C++", pero me gustaría que un desarrollador de g ++ repita por qué - No conozco la arquitectura de gcc.

Al utilizar el ensamblaje, puede revisar el código resultante buscando lo que se asemeja a su función. Como resultado de ejecutar gcc -S -O1 {} yourcode.cpp, tengo esta (AMD64 4.4.4 gcc)

_Z3addIiET_S0_S0_: 
.LFB2: 
    .cfi_startproc 
    .cfi_personality 0x3,__gxx_personality_v0 
    leal (%rsi,%rdi), %eax 
    ret 
    .cfi_endproc 

Lo que realmente es sólo una adición int (Leal).

Ahora, ¿cómo decodificar el creador de nombres de C++? hay una utilidad llamada C++ filt, pegar el nombre canónico (C-equivalente) y se obtiene el recompuestos C++ equivalente

[email protected] /dev/shm $ c++filt 
_Z3addIiET_S0_S0_ 
int add<int>(int, int) 
+0

Si a las personas se les permitiera ver el código de la plantilla generada, probablemente sería demasiado leer de todos modos ... en el caso del STL –

+3

Bien , las personas pueden ver el ensamblaje generado, ya es bastante, sin embargo, a veces es justo lo que necesita para obtener información valiosa ... – qdot

+1

@qdot es completamente diferente ver el ensamblado y el código generado por C++. En ocasiones, si desea generar la jerarquía de las clases utilizando TypeLists, probablemente necesite ver los resultados como un código de C++ para asegurarse en su jerarquía. El montaje no ayuda en absoluto en este caso. – AlexTheo

3

Lo más fácil es inspeccionar el ensamblaje generado. Puede obtener una fuente de ensamblaje utilizando la bandera -S para g ++.

2

Cuando el optimizador ha realizado sus acciones, lo más probable es que no tenga nada que se parezca a una llamada a la función. En su ejemplo específico, definitivamente terminará con una adición en línea, en el peor. Aparte de eso, siempre puedes emitir el ensamblador generado en un archivo separado durante la compilación, y ahí radica tu respuesta.

24

Si quieres ver la salida de montaje, utilice esto:

g++ -S file.cpp 

Si desea ver algunos (pseudo) código C++ que genera GCC, puede utilizar esto:

g++ -fdump-tree-original file.cpp 

para su función add, ese algo es la salida como

;; Function T add(const T&, const T&) [with T = int] (null) 
;; enabled by -tree-original 

return <retval> = (int) *l + (int) *r; 

(me pasaron los parámetros de referencia para hacer la salida un poco más interesante)

1

Si estás buscando por el código C++ equivalente entonces no. El compilador nunca lo genera. Es mucho más rápido para el compilador generar su representación intermedia directamente que generar primero C++.

8

Clang (https://clang.llvm.org/) puede AST agradable para la impresión de la plantilla de instancia:

Para su ejemplo:

test.cpp

template < class T> T add(T a, T b){ 
    return a+b; 
} 

void tmp() { 
    add<int>(10,2); 
} 

Comando de impresión bastante-AST:

$ clang++ -Xclang -ast-print -fsyntax-only test.cpp 

C lang-5.0 salida:

template <class T> T add(T a, T b) { 
    return a + b; 
} 
template<> int add<int>(int a, int b) { 
    return a + b; 
} 
void tmp() { 
    add<int>(10, 2); 
} 
Cuestiones relacionadas