2011-06-12 15 views
6

Para la depuración Tengo muchas llamadas a una función de registro de depuración en mi aplicación. Por supuesto, en la versión de producción, estas llamadas de depuración deben omitirse. En lugar de escribir:Directiva de depuración y preprocesador

#if DEVEL == 1 
    Log::debug(...); 
#endif 

alrededor de todas las llamadas a la función de depuración decidí que el escribir la siguiente en la función de depuración en sí:

#if DEVEL != 1 
    return; 
#endif 

¿La sobrecarga de la llamada a la función inútil ser evitado por el compilador ¿o estoy mejor usando una construcción (muchos fea) #if #endif por razones de rendimiento?

Respuesta

7

lugar de preocuparse por optimizador, que puede hacer un simple truco:

#if DEVEL == 1 
#define LOG_DEBUG(...) Log::Debug(__VA_ARGS__) // variadic macro 
#else 
#define LOG_DEBUG 
#endif 

Ahora usa LOG_DEBUG todas partes para que sea sencillo.

+0

Agradable. Sin embargo, ¿por qué la versión #else no toma parámetros? –

+0

@Kerrek, porque solo hay 2 condiciones. Si no es 'DEVEL == 1', seguramente será' DEVEL! = 1'. – iammilind

+0

Lo siento, lo que quise decir es ¿por qué la primera versión de LOG_DEBUG tiene argumentos (paréntesis), pero la segunda no? Si escribe 'LOG_DEBUG (" hello ")', entonces la segunda macro se expandiría a '" hello "', no nada, ¿no? –

5

Si la función está disponible para la alineación (por ejemplo, se implementa en el encabezado), entonces el optimizador no tendrá problemas para deshacerse de la llamada a la función y así no tener gastos generales.

+1

Incluso si no está definido en el archivo de encabezado, la llamada probablemente será eliminada por las optimizaciones de tiempo de enlace. – Timo

+0

@Timo, de ahí el "* eg *" – Motti

+0

Es mejor eliminarlo en tiempo de compilación, por lo que la llamada no afecta la asignación de registro o prólogo/epilog para una función de llamador hoja versus no hoja –

2

¿Por qué no lo haces?

Con gcc solo compile con -S, y mire la salida.

+0

y enciende el optimizador: - O o -O3 –

Cuestiones relacionadas