En la mayoría de los casos, si quiero crear una característica opcional en C, simplemente crear dos funciones de la siguiente manera:¿Por qué GCC mantiene las funciones vacías?
#ifdef OPTIONAL_SOMETHING
void do_something(int n, const char *s)
{
while (n--) {
printf("%s", s);
}
/* ...You might get the point, really do something... */
}
#else
void do_something(int n, const char *s)
{
/* Empty body */
}
#endif
Así que si no está definido el símbolo - cuando la función está desactivada - una función de vacío se compila en el ejecutable.
Profundizando en el listado de montaje, parece que GCC compila y pide las funciones vacías cuando las optimizaciones están desactivados. Si las optimizaciones están habilitadas, también con -O2
y -O3
, compila solo el código de manejo de pila necesario, pero optimiza las instrucciones de la llamada. En general, mantiene la función.
Casi lo mismo aplica para los métodos no vacíos, pero no utilizados.
Simplemente debería descartar todo, pero no es así. ¿Por qué es el comportamiento predeterminado? Y solo por curiosidad: ¿cómo puedo eliminar esto?
"Si las optimizaciones están habilitadas, también con -O2 y -O3 compila solo el código de manejo de pila necesario, pero optimiza las instrucciones de llamada". ¿Esto significa que todavía hay algunos gastos generales de esta manera? 'start_timer(); do_something(); stop_timer();' tarda más que 'start_timer(); stop_timer();'? –