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.
¿Qué quiere decir "usar instanciación explícita para generar las instancias requeridas en un solo lugar"? – kFk