-Og
es una opción de optimización relativamente nueva que pretende mejorar la experiencia de depuración al aplicar optimizaciones. Si un usuario selecciona -Og
, me gustaría que mis archivos de origen activen rutas de código alternativas para mejorar la experiencia de depuración. GCC ofrece la macro de preprocesador __OPTIMIZE__
, pero solo se establece en 1 cuando las optimizaciones están en vigor.
¿Hay alguna manera de aprender el nivel de optimización, como -O1
, -Og
-O3
para usar con el preprocesador?
No sé si esto es un truco inteligente, pero es un truco.
$ gcc -Xpreprocessor -dM -E - < /dev/null > 1 $ gcc -Xpreprocessor -dM -O -E - < /dev/null > 2 $ diff 1 2 53a54 > #define __OPTIMIZE__ 1 68a70 > #define _FORTIFY_SOURCE 2 154d155 < #define __NO_INLINE__ 1
clang no produjo el FORTIFY.
Creo que esto no es posible saber directamente el nivel de optimización utilizado para compilar el software ya que no está en la lista de símbolos de preprocesador definidos
Puede confiar en -DNDEBUG
(sin depuración) que se usa para deshabilitar aserciones en el código de liberación y habilitar su ruta de código de "depuración" en este caso.
Sin embargo, creo que lo mejor que puede hacer es tener un conjunto de símbolos locales para su proyecto en todo el sistema y dejar que el usuario elija qué usar explícitamente:
MYPROJECT_DNDEBUG
MYPROJECT_OPTIMIZE
MYPROJECT_OPTIMIZE_AGGRESSIVELY
Esto hace que la depuración o las diferencias de comportamiento entre la versión/depuración sean mucho más fáciles, ya que puede activar/desactivar gradualmente los diferentes comportamientos.
Existen algunas macros de preprocesador específicas del sistema, según su objetivo. Por ejemplo, la variante XC16 específica de Microchip de gcc (actualmente basada en gcc 4.5.1) tiene la macro de preprocesador __OPTIMIZATION_LEVEL__
, que toma los valores 0, 1, 2, s o 3.
Tenga en cuenta que anular la optimización para una rutina específica, por ejemplo, con __attribute__((optimize(0)))
, no cambia el valor de __OPTIMIZE__
o __OPTIMIZATION_LEVEL__
dentro de esa rutina.