verbos una trabajo redactar proyecto para objetivos objetivo investigacion general formular especificos empezar ejemplos educativo como aprendizaje gcc g++

gcc - una - ¿Cuál es el mejor nivel de optimización de g++ al construir un objetivo de depuración?



objetivos especificos de una investigacion (3)

Cuando desee construir algo que sea depurable (g ++ específicamente, pero tal vez comparta una respuesta con gcc), ¿cuál es el mejor nivel -O? En otras palabras, al construir un objetivo de "depuración" en lugar de un objetivo de "liberación".

Los documentos en línea de gcc son un poco escasos al comparar -O0 y -O1 ( here ). Mi interpretación es que -O1 solo permite una optimización que incluso puede afectar la capacidad de resolución, que es -fomit-frame-puntero. Pero para citar el documento, solo está habilitado en -O1 ", donde hacerlo no interfiere con la depuración". ¿Estoy interpretando eso correctamente?

Otra publicación en este sitio ( here ) habla sobre -O2 específicamente, y la respuesta es básicamente "funciona pero obtienes una ejecución fuera de orden". Lo cual, IMO, puede ir desde molesto hasta devastador dependiendo de qué tan mal salten las cosas.


Entonces ... ¿qué indicadores son apropiados para la compilación de depuración?

Lo que sea que estés confortablemente depurando.

Cuando -g -O0 con -g -O0 , la depuración es más fácil, pero el código se ejecuta muy lentamente.

Cuando construya con -g -O1 , comenzará a observar la optimización a veces . Intentará entrar en una función y descubrirá que está en línea, etc.

Con -g -O2 , notará la optimización mucho . Se optimized out cuando imprima variables [1], obtendrá saltos inesperados en el código, etc.

Con -g -O3 verá los mismos síntomas, pero con mayor frecuencia.

GCC en realidad no tiene niveles más allá de -O3 , así que ese es el final de la línea.

Las personas que entienden las transformaciones que realizó GCC con -O3 tendrán pocos problemas para depurar ese código (siempre puedes echar un vistazo al ensamblaje, averiguar dónde reside realmente la variable que deseas e ir desde allí). Pero para simples mortales, generalmente es bastante difícil de depurar -O2 código -O2 .

[1] Hay un trabajo actual en GDB y GCC para reducir el número de instancias de optimized out , pero aún no está terminado.


GCC 4.8 presenta un nuevo nivel de optimización: -Og para obtener lo mejor de ambos mundos.

-Og
Optimizar la experiencia de depuración. -Og habilita optimizaciones que no interfieren con la depuración. Debería ser el nivel de optimización de elección para el ciclo de edición-compilación-depuración estándar , ofreciendo un nivel razonable de optimización, manteniendo una compilación rápida y una buena experiencia de depuración.

De esta forma se realiza una optimización para que obtenga un mejor rendimiento, una mejor detección de variables posiblemente no iniciadas y también puede recorrer un programa en GDB sin saltar de un lado a otro a través de la función.


el modo de depuración (el -g ) y los niveles de optimización (la familia -O* ) son problemas independientes. la bandera -g básicamente instruye a gcc para que incluya símbolos de depuración al compilar (y algunas pistas correspondientes a los números de línea en el código). Se puede aplicar a cualquier nivel de optimización.

La respuesta simple, por lo tanto, es "el mejor nivel de optimización de g ++ al construir el programa de producción", que es una discusión mucho más larga