2009-01-06 7 views
6

Soy desarrollador C++ y uso Visual Studio 2008. ¿Cómo puedo reducir el tamaño de los archivos * .obj? He leído why are my visual studio .obj files are massive in size compared to the output .exe? pero no he encontrado la respuesta.Tamaño de archivos VisualStudio * .obj (513Mb objs y 534Mb lib)

Cuando construyo el proyecto en una lib estática, el tamaño total de todos los archivos * .obj es de 513Mb y la lib resultante es de 534Mb. Cada archivo obj es 1-13Mb. El archivo Debug exe es de 11Mb. La generación de código de tiempo de enlace (/ Gm) está desactivada.

Gracias de antemano.

Respuesta

5

Los archivos de objetos tienden a aumentar de tamaño debido a la gran cantidad de códigos duplicados y símbolos colocados en varios archivos de objeto. Normalmente esto es causado por copias de funciones en línea y código de plantilla instanciada.

El ejecutable resultante es mucho, mucho más pequeño que la suma de todos los archivos de objetos, ya que los símbolos débiles duplicados y los símbolos sin referencia se pueden descartar.

Personalmente, no me preocuparía el tamaño del archivo de objeto, pero si desea reducirlo, minimice el uso de funciones en línea y considere guardar el código de plantilla en archivos separados del otro código y usar instanciación explícita para generar el instancias en un solo lugar.

Ejemplo

Suponga que tiene esto en un archivo de cabecera.

template< class T > 
inline void F(T* t) 
{ 
    // ... some code 
} 

Si utiliza F para un puñado de tipos, entonces cada unidad de traducción generará copias de la función de los tipos que utiliza.

Si reemplaza con sólo una declaración:

template< class T > void F(T* t); 

entonces se puede generar sólo los instantations que necesitas en un archivo fuente independiente:

template< class T > void F(T* t) 
{ 
    // definition 
} 

template void F<int>(int*); 
template void F<char>(char*); 
template void F<MyType>(MyType*); 

Por supuesto, ahora tiene que administrar manualmente para qué tipos necesita una instanciación de plantilla.

+1

¿Qué quiere decir "usar instanciación explícita para generar las instancias requeridas en un solo lugar"? – kFk

Cuestiones relacionadas