Pregunta

Estoy interesado en reducir el tamaño del archivo de mi solicitud. Se trata de una aplicación MFC / C ++ construido con MVC ++ en Visual Studio 2008. UPX hace un buen trabajo de reducir el exe final a alrededor del 40% de su tamaño original, pero me gustaría reducirlo más.

MFC debe estar enlazado estáticamente en este proyecto.

He intentado algunos métodos descritos en esta pregunta: reducir-windows-ejecutable de tamaño . Específicamente la aplicación de diferentes configuraciones para el compilador / enlazador.

Creo que puedo reducir el tamaño adicionalmente por tener una mirada en el 'costo' de la inclusión de ciertos encabezados en el proyecto.

Cualquier consejo sobre cómo hacer esto, tal vez una herramienta que podría analizar el código para mí? Gracias

¿Fue útil?

Solución

Usted probablemente está mal en este. Eliminación de las cabeceras pueden resultar en tiempos de construcción algo más cortas, sino como lo que es en su mayoría contienen declaraciones (que va a necesitar en algún momento de todos modos) que debe tener poco o ningún efecto sobre el tamaño del ejecutable final.

Otros consejos

La única manera de reducir el tamaño del proyecto es reducir la cantidad de código. Como se indicó Neil, eliminando las cabeceras sólo acortar el tiempo de construcción. Los compiladores no incluirán todo cuando se hace una cláusula de "uso de espacio de nombres", que sólo va a seleccionar lo que se necesita. Ahora, por el contrario, si va a añadir cabeceras a las cosas no utilizado en cualquier sitio dentro del proyecto que es una buena indicación de una clase que debe ser eliminado.

Su hipótesis es que al parecer el tamaño del ejecutable es de alguna manera la suma de los componentes que contribuyen, y en los archivos fuente en particular. Simplemente no funciona de esa manera.

Por ejemplo, supongamos que el código para std::list<T>::size. Se puede utilizar en muchas unidades de traducción. Sin embargo, el enlazador se plegará muchas copias juntos, a veces incluso para diferentes tipos T. Pero, ¿cómo explica usted los bytes resultantes en el exectuable?

Ahora, si ni siquiera se puede determinar cómo dar cuenta de los bytes de esa sencilla (conjunto de funciones), entonces ¿cómo dar cuenta de las construcciones aún más complejos? Y si no se puede asignar bytes utilizados en el ejecutable para INDIVUAL archivos de origen, entonces no puede determinar las contribuciones individuales.

Conectores típicamente sólo contienen:

  1. Macros
  2. Definiciones de tipos (como clases)
  3. Función declaración adelantada (la definición de función se encuentra en el archivo .c / Cpp)

Ninguna de las anteriores en realidad se traduce en código máquina que está siendo generada a menos que sean realmente utilizadas por el código de los archivos /.cpp .c.

Ahora todas las necesidades anteriores para ser analizados (que se suma al tiempo de compilación), pero será ignorado si no se utiliza realmente.

La mayoría de las respuestas existentes han asumido que sólo los encabezados contienen declaraciones, que no tienen impacto en el tamaño del ejecutable. Por supuesto, eso es cierto si esa suposición es válida, pero se está haciendo bastante común para los encabezados para contener código actual, así (definiciones de funciones, por lo general), y los que contribuyen al tamaño del código.

Por otro lado, sólo contribuyen si esas funciones están realmente unidos en el ejecutable final. Y que sólo están vinculados a la final ejecutable si Llamar esas funciones. Así que, aunque la cabecera podría contribuir al crecimiento de su tamaño del ejecutable, ¿qué vas a hacer al respecto? No se puede quitar el código que ha utiliza . Extracción del archivo de cabecera simplemente no es una opción y -. A menos que mueva ese código en otro lugar, y luego se va a aumentar el tamaño del ejecutable todos modos

Así que, o una cabecera no hace ninguna diferencia, o se hace una diferencia porque se utiliza el código que está en él, y entonces no se puede quitar. En cualquiera de los casos, la eliminación de las cabeceras no va a comprar mucho.

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