2010-01-26 11 views
15

¿Hay alguna manera de ver — el resultado del preprocesamiento con gcc -E — para ver cómo se ven mis objetos una vez compilados en los archivos de objeto?Disposición de objetos compilados

Estoy hablando de GCC, pero una solución que incluye MSVC estaría bien.

+2

Qué quiere decir código o datos? –

+0

Buen punto John. El constructor será código, y como todo código pertenece a la clase, no objetos individuales. Por lo tanto, no lo encontrará en el diseño del objeto. – MSalters

+1

Puede usar 'g ++ -S file.cpp' para obtener la salida del ensamblador en' file.s'. ¿Es esto lo que quieres? – msandiford

Respuesta

0

Los archivos de objeto contienen datos binarios: el único nivel superior que la mayoría de los compiladores pueden generar es ensamblador, por lo que si no puede leerlo, no tiene suerte. Sin embargo, eche un vistazo a this question para obtener más información en esta área.

0

Puede inspeccionar el diseño de los archivos binarios y sus contenidos mediante archivos de mapas. Utilice /MAP para VC y -Map o --print-map para gcc.

0

Su pregunta es un poco confusa.

Si desea ver el resultado del preprocesamiento con MSVC, puede usar /E, /P/ o /EP.

Existe una opción no documentada en MSVC para mostrar el diseño de datos de las estructuras y clases. Tengo problemas para encontrarlo ahora.

+0

> Hay una opción no documentada en MSVC para mostrar el diseño de datos de las estructuras y clases. Tengo problemas para encontrarlo ahora. esto es exactamente lo que estoy buscando! – user257620

+2

Finalmente logré desenterrar esos conmutadores: '/ d1reportSingleClassLayoutXXX' y'/d1reportAllClassLayout'. –

5

Para los ejecutables compilados de GCC, pago Pahole. Le mostrará cómo el compilador diseñó sus estructuras/clases y si tienen o no "agujeros" en ellas. Los agujeros están rellenos debido a las reglas de alineación de la memoria.

+1

(+1) naice tool –

+1

el enlace del pozo está muerto – ofloveandhate

+0

@ofloveandhate He reparado el enlace. – paxos1977

0

Un constructor es simplemente otra función (a menos que esté alineado). Los archivos de objeto contienen mucha información para el enlazador; por lo tanto, debería poder encontrar la función en el archivo .a (sin embargo, los nombres de las funciones se desfigurarán).

19

Para Visual C++:

que finalmente lograron desenterrar las banderas (bien escondido!) Compilador MSVC++ indocumentados que admite el uso de información de here y here. Aquí están:

/d1reportSingleClassLayoutXXX 
/d1reportAllClassLayout 

(XXX reemplazar con el nombre de clase)