2010-08-19 18 views
13

Mi ejecutable tenía 364 KB de tamaño. No usé una clase Vector2D, así que implementé una con operadores sobrecargados.¿Qué hace que los EXE crezcan en tamaño?

me cambió la mayor parte de mi código de

point.x = point2.x; 
point.y = point2.y; 

a

point = point2; 

Esto dio lugar a la eliminación de casi 1/3 de mis líneas de código y sin embargo mi exe es todavía 364KB. ¿Qué exactamente hace que crezca en tamaño?

+1

¿Por qué sería menos? 'point = point2' está haciendo exactamente el mismo trabajo que antes (dentro del operador), solo con una interfaz diferente. – GManNickG

+1

@GMan: es por eso que está haciendo esta pregunta ... tal vez él cree que el exe creció en tamaño según las líneas de código. –

+4

Voy a votar esto simplemente por el hecho de que esta es una muy buena pregunta que mucha gente pregunta cuando comienza su programación. –

Respuesta

9

¿Qué hace que los EXE crezcan de tamaño?

Bibliotecas externas, especialmente bibliotecas estáticas e información de depuración, tamaño total de su código, biblioteca de tiempo de ejecución. Más código, más bibliotecas == exe más grande

Para reducir el tamaño de exe, debe procesar exe con la utilidad gnu strip, deshacerse de todas las bibliotecas estáticas, deshacerse de las bibliotecas de tiempo de ejecución de C/C++, deshabilitar todas las comprobaciones de tiempo de ejecución y activar las optimizaciones del tamaño del compilador. Trabajar sin CRT es un dolor, pero es posible. También hay una biblioteca wcrt (alternativa C tiempo de ejecución) creada para hacer pequeñas aplicaciones (por cierto, no se ha actualizado/mantenido durante los últimos 5 años).

El exe más pequeño que he podido crear con el compilador msvc está en algún lugar alrededor de 16 kilobytes. Esta era una aplicación de Windows que mostraba una sola ventana y requería msvcrt.dll para ejecutarse. Lo modifiqué un poco, y lo convertí en una broma práctica que elimina la imagen en el monitor.

Para obtener impresionantes técnicas de reducción de tamaño de exe, es posible que desee consultar .kkrieger. Es un shooter 3D en primera persona, con un total de 96 kilobytes. El juego tiene un nivel grande y detallado, admite sombreadores, sombras en tiempo real, etc. comparable con Saurbraten (ver screenshots). La aplicación de Windows más pequeña (demostración en 3D con música) que encontré fue de 4 kilobytes, y usé técnicas de compresión y (probablemente) funciones no documentadas (es decir, el hecho de que * .com executbale pudiera descomprimir y ejecutar Win32.exe en Windows XP).

En la mayoría de los casos, el tamaño de * .exe en realidad no debería molestarlo (no he visto un disquete durante algunos años), siempre que sea razonable (menos de 100 megabytes). Por ejemplo, de tamaño de archivo "irrazonable", vea la construcción de depuración de Qt 4 para mingw.

Esto dio como resultado la eliminación de casi 1/3 de mis líneas de código y aún así mi exe sigue siendo de 364KB.

más probable es que es causada por las bibliotecas externos utilizados por compilador, cheques de tiempo de ejecución, etc. Además, esta es una operación de asignación. Si no está utilizando tipos personalizados para x (con el constructor de copias), es muy probable que la operación de "copiar" resulte en un número pequeño de operaciones, es decir, eliminar 1/3 de líneas no garantiza que su código sea 1/3. corta.

Si desea ver cuánto impacto tuvo su modificación, podría "pedir" al compilador que produzca una lista de asm para ambas versiones del programa y luego comparar los resultados (manualmente o con diff). O puede desasar/comparar ambas versiones de ejecutable. BUt estoy seguro de que usar GNU strip o eliminar bibliotecas adicionales tendrá más efecto que eliminar operadores de asignación.

6

¿Qué tipo es el punto? Si se trata de dos flotantes, entonces el compilador realizará implícitamente una copia de miembro por miembro, que es la misma que antes.

EDITAR: Al parecer, algunas personas en la multitud de hoy no entendieron esta respuesta y se compensaron con la votación negativa. Así que permítanme explicar:

Las líneas de código no tienen relación con el tamaño del archivo ejecutable. El código fuente le dice al compilador qué línea de ensamblaje crear. Una línea de código puede causar cientos si no miles de instrucciones de ensamblaje. Esto es particularmente cierto en C++, donde una línea puede causar la construcción implícita de objetos, destrucción, copiado, etc.

En este caso particular, supongo que el "punto" es una clase con dos carrozas, por lo que usar el operador de asignación realizar una copia miembro por miembro, es decir, toma a cada miembro individualmente y lo copia. Que es exactamente lo mismo que hizo antes, excepto que ahora está hecho implícitamente. El ensamblaje resultante (y, por lo tanto, el tamaño ejecutable) es el mismo.

+0

¿Quién votará sin ningún comentario? ¿Que pasa con eso? – EboMike

+0

+1 para el voto sin comentarios, ¡no genial! –

+0

Bajé la votación porque no responde la pregunta. –

4

Los archivos ejecutables se suelen clasificar en 'páginas' en lugar de en bytes discretos.

+0

¿Podría el infractor por favor dejar un comentario? Gracias. –

+0

"would the downvoter" Lo mismo. La respuesta no aborda "lo que hace que exe crezca en tamaño". Páginas o no, normalmente es posible reducir el tamaño de 300+ kb ejecutable. – SigTerm

+0

Responde la pregunta: eliminar algunas líneas de código puede no ser suficiente para reducir el tamaño de página siguiente. –

1

Cuando compila un programa c o C++ en un archivo ejecutable, el compilador traduce su código en código máquina y aplica las optimizaciones que considere oportunas. Pero, simplemente, más código = más código de máquina para generar = más tamaño para el ejecutable.

11

Probablemente, el compilador haya optimizado la sobrecarga de su operador incrustándolo. Por lo tanto, se compila efectivamente con el mismo código que el ejemplo original. Así que puede haber cortado muchas líneas de código al sobrecargar al operador de asignación, pero cuando el compilador ingresa, toma los contenidos de su operador de asignación y lo pega en línea en el punto de llamada.

Inlinear es una de las formas en que un ejecutable puede crecer de tamaño. No es la única forma, como puedes ver en otras respuestas.

+0

Woah, wtf? ¿Abajo los votos? ¿Por qué? – Anthony

+0

"¿Por qué?" Porque su respuesta no aborda el "¿Qué hace que los EXE crezcan en tamaño?" parte. – SigTerm

+0

@SigTerm: ¿Mejor? – Anthony

3

Creo que este es un buen ejemplo de por qué uno no debería preocuparse demasiado por el código que es demasiado detallado si tiene un buen compilador de optimización. En cambio, siempre codifique con claridad para que otros programadores puedan leer su código y dejar la optimización al compilador.

0

Además, compruebe si tiene muchos objetos estáticos/globales. Esto aumenta sustancialmente su tamaño de exe si no se inicializan en cero.

Por ejemplo:

tamaño
int temp[100] = {0}; 
int main() 
{ 

} 

del programa anterior es 9140 bytes en mi máquina Linux.

si inicializo la matriz temporal a 5, entonces el tamaño se disparará en alrededor de 400 bytes. El tamaño del programa a continuación en mi máquina Linux es 9588.

int temp[100] = {5}; 
int main() 
{ 

} 

Esto es así porque, inicializados a cero objetos globales entran en .bss segmento, que la enfermedad esté inicializado a la vez durante el inicio del programa. Donde los contenidos de los objetos inicializados no nulos se incorporarán en el propio exe.