2011-09-06 16 views
9

Cuando compilamos un archivo C++, se genera un archivo obj. Quiero saber de qué factores depende el tamaño del archivo obj?¿De qué depende el tamaño de un archivo de objeto C++?

Simplemente para hacer mi pregunta más clara, Por ejemplo, un archivo C++ contiene una declaración de clase y esta clase tiene 1 variable entera como miembro de datos y también tiene algunas funciones miembro. Si compilo este archivo, se creará un archivo obj de algún tamaño X. Supongamos ahora que agrego más miembros de datos y funciones miembro, ¿entonces cambiará el tamaño del archivo obj?

+3

No intentaré sacar ninguna conclusión entre el tamaño del archivo "obj" y el tamaño del objeto (memoria). ¿Qué es lo que estás tratando de lograr? –

+0

Aquí estoy interesado en el tamaño del archivo obj ya que sé que el tamaño del objeto dependerá de los datos que tenga. ¿Pero puede decirme de qué factores depende el tamaño del archivo obj?En realidad, me preguntaron esto en una entrevista, así que quería saber la respuesta. –

Respuesta

10

Eso depende de un millón de factores diferentes y depende totalmente de la plataforma y del compilador y de la configuración.

El archivo de objeto debe contener todo el conjunto para cuerpos de funciones para funciones con enlace externo, así como todas las variables globales con enlace externo. Cualquier cosa con enlace interno puede o no garantizar una entrada separada en el archivo objeto, ya que pueden haberse optimizado e integrado directamente en su sitio de llamadas. Esto depende en gran medida de la configuración de optimización.

GCC también tiene una opción para "optimizaciones de tiempo de enlace" que básicamente agrega una copia de todo el código fuente al archivo objeto y aumenta su tamaño de manera espectacular.

Los símbolos de depuración también agregan muchos datos adicionales.

Para su pregunta específica de C++: una definición de clase en sí misma no es realmente visible en el ensamblado. Las funciones de miembros no alineados son solo más funciones que deben compilarse, mientras que los miembros de datos solo reciben el mismo tratamiento que los miembros de datos primitivos: estarán en la pila de llamadas si declaras instancias de ese tipo, pero no directamente impactar el código ensamblador ... a menos que esté inicializando cosas con constantes; las constantes entran en el código, por supuesto.

+0

Muchas gracias Kerrek. –

3

El archivo objeto contiene (entre otros) el código máquina después de compilar su fuente, pero antes de que se vincule. El tamaño del archivo de objeto, por lo tanto, básicamente depende de la complejidad del código.

La mayoría de los compiladores le dan la opción de agregar símbolos de depuración durante la compilación para facilitar la depuración, pero aumentarán el tamaño de su archivo de objeto. Puede agregar los símbolos de depuración con la opción -g y despojarlos con la opción -s en GCC. Visual Studio tiene algo similar.

2

Depende mucho del compilador, pero.

El archivo objeto contendrá código ejecutable, stubs de enlaces y metadatos. Los metadatos pueden ser cualquier cosa dependiente del compilador, por lo que está fuera de cuestión, cualquier cosa puede suceder dependiendo de lo que piense el compilador. Los talones de vinculación se crean para todas las entidades con vinculación externa y para todas las referencias salientes a entidades en otros archivos de objeto; esto no se ve directamente afectado al agregar miembros a la clase en el mismo archivo de objeto.

Ahora al código. Cuando agrega una variable miembro, debe construirse y destruirse, lo que requerirá un constructor y un destructor, los cuales pueden ser triviales o no. Si no son triviales, esto generará un ligero aumento en el tamaño del código, ya que ahora se debe hacer algo adicional para manejar esas variables miembro y eso requiere código adicional.

Cuestiones relacionadas