Pregunta

Estoy trabajando en un programa C ++ y el código objeto compilado de un solo archivo de 1200 líneas (que inicializa una máquina de estado bastante compleja) llega a casi un megabyte. ¿Qué podría estar haciendo el archivo tan grande? ¿Hay alguna manera de encontrar lo que ocupa espacio dentro del archivo de objeto?

¿Fue útil?

Solución

Puede haber varias razones cuando los archivos de objetos son más grandes de lo que deben ser como mínimo:

  • incluyendo estáticamente las bibliotecas dependientes
  • construcción con información de depuración
  • edificio con información de perfil
  • creando estructuras de datos (extremadamente) complejas usando plantillas (quizás estructuras de refuerzo recursivas)
  • no activa las banderas de optimización mientras compila (no ahorra mucho y puede causar dificultades si se usa demasiado)

Al principio sugiero verificar si está compilando con información de depuración, esto causa la mayor hinchazón en mi experiencia.

Otros consejos

(Asumo que tienes optimizaciones y eliminación de código muerto activados).

Active el " de su enlazador; genere el archivo de mapa " opción y examine la salida.

Los culpables comunes son las macros / plantillas que producen grandes cantidades de código y grandes objetos globales.

Posiblemente algunas instancias de plantilla (especialmente las std::iostream s), y tal vez una amplia alineación (es decir, clases que están completamente definidas en un encabezado). Sin embargo, ¿cuál es el problema con un archivo de objeto de 1 megabyte en primer lugar? Durante la vinculación, podría muy bien resultar en un pequeño binario. Tengo un proyecto aquí con 20 MiB de archivos de objetos que se vinculan a un binario de 700 KiB, por ejemplo.

Actualización: también podría ser una gran matriz / objeto estático. Además de eso, con MSVC ++ y GCC, puede mirar el ensamblado generado para un archivo, que puede darle algunas sugerencias (con GCC, es g++ -S foo.cpp, para MSVC ++, es '/ FAs' ). O verá muchas instancias de plantilla, entonces esta es la razón. Si no, es el tamaño del objeto de static objetos.

Otra posible razón es Link-Time Code Generation, una opción de VC ++. Esto mueve el backend del compilador al enlazador. Esto permite mejores optimizaciones, pero el archivo de objeto ahora debe contener todas las estructuras de datos internas que generalmente se pasan entre el front-end y el backend.

Aquí hay una macro que uso para ver los valores de tiempo de compilación:

template <size_t N> struct compile_time_number { private: typedef int check; };
#define compiler_check_number(N) ((compile_time_number< N >::check)0)

Luego, vaya feliz en el momento de la compilación para ver qué símbolos están ocupando espacio.

Editar: dado que nadie parece entender esto, aclararé: la forma de usar esto es agregar compiler_check_number(sizeof(<insert struct or global variable here>)). El compilador escupirá el tamaño de la variable o estructura como un error de tiempo de compilación. Muy raramente el código es la razón de un archivo de objeto enorme.

Lo uso todo el tiempo para ver cuán grandes son las cosas sin tener que ejecutar un depurador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top