2009-10-08 13 views

Respuesta

15

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

no hay 'una talla para todos' - es necesario entender su aplicación, los requisitos y los parámetros de optimización para determinar el subconjunto correcto para su binario.

O la respuesta que desea: -O3

+0

Hice y no pude encontrar una explicación directa. Sin embargo, podría apestar buscando. – Polaris878

+2

Además, el objetivo de SO es aparecer en los motores de búsqueda como Google, así que es mejor tenerlo aquí de todos modos. – Polaris878

+0

Llamada justa. ¿Esto es lo que estabas buscando? ¿O necesitas un poco más de contexto/información? – Josh

3

O2 se encenderá todas las optimizaciones que no requieren un espacio de comercio \ a la velocidad y tiende a ser el que veo utiliza con mayor frecuencia. -O3 tiene algo de espacio para compensaciones de velocidad (como función en línea.) -Os hace otras cosas para reducir el tamaño del código. Esto puede hacer que las cosas sean más rápidas que O3 al mejorar el uso de la memoria caché. (pruebe para saber si le funciona). Tenga en cuenta que hay una gran cantidad de opciones que ninguno de los conmutadores O toca. La razón por la que se quedan fuera es porque a menudo depende del tipo de código que está escribiendo o depende de la arquitectura.

7

Tenga en cuenta que gcc no tiene un "modo de lanzamiento" y un "modo de depuración" como lo hace MSVC. Todo el código es solo código. La presencia de varias opciones de optimización (-O2 y -Os son las únicas por las que generalmente debe preocuparse a menos que esté realizando ajustes muy precisos) modifica el código generado, pero no de una manera que impida la interoperabilidad con otras normas ABI. código. En general, quiere optimización en las cosas que desea lanzar.

La presencia de la opción "-g" causará que los símbolos generados y la información del código fuente se coloquen en los archivos generados, lo cual es útil para la depuración pero aumenta el tamaño del archivo (y revela su código fuente). es algo que a menudo no quieres en binarios "lanzados".

Pero no son exclusivos. Puede tener un código binario compilado con información de optimización y depuración, o uno con ninguno.

+1

Por lo general, la optimización debería deshabilitarse si tiene la intención de depurar el código generado, de lo contrario, encontrará que la depuración es una experiencia similar a una película de David Lynch. – caf

+0

No es tan malo, miro los volcados de pila y la salida valgrind de los binarios de "publicación" todo el tiempo. Siempre y cuando no utilice -fomit-stack-pointer y entienda que la estática puede estar en línea e invisible, puede leer una gran cantidad de contexto, incluso de un binario muy optimizado. Si sus funciones son cortas, generalmente puede averiguar la expresión que se estrelló con una o dos conjeturas. –

+0

A diferencia de una película de David Lynch, sin embargo, los depuradores permiten al espectador alternar a voluntad entre los diferentes niveles de la realidad. Si entiendes el desmontaje, entonces el paso simple a través de eso (con las líneas fuente intercaladas) generalmente tiene cierto sentido incluso con la optimización. Si no comprende el desmontaje, entonces aprenderá. –

15

Aquí hay una parte de un archivo MAKE que utilizo regularmente (en este ejemplo, está intentando construir un programa llamado foo).

Si lo ejecuta como $ make BUILD=debug o $ make debug continuación, se utilizará el depuración CFLAGS. Estos desactivan la optimización (-O0) e incluyen símbolos de depuración (-g).

Si omite estas banderas (mediante la ejecución de $ make sin ningún parámetro adicional), construirá la versión Release CFLAGS donde la optimización está activada (-O2), símbolos de depuración despojados (-s) y las afirmaciones desactivan (-DNDEBUG) .

Como han sugerido otros, puede experimentar con diferentes configuraciones de -O* dependiendo de sus necesidades específicas.

ifeq ($(BUILD),debug) 
# "Debug" build - no optimization, and debugging symbols 
CFLAGS += -O0 -g 
else 
# "Release" build - optimization, and no debug symbols 
CFLAGS += -O2 -s -DNDEBUG 
endif 

all: foo 

debug: 
    make "BUILD=debug" 

foo: foo.o 
    # The rest of the makefile comes here... 
Cuestiones relacionadas