Según tengo entendido, este atributo le dice al compilador que una función no regresa. ¿Cuál es el beneficio de especificar esto cuando una función tiene un retorno nulo?
¿En qué se diferencian estas dos funciones?
void foo(){} __attribute__((noreturn)) void foo(){}No significa que la función no devuelva un valor, significa que la función no devuelve nada . Llamar a la función da un viaje de ida.
Hay un uso limitado de esto en la programación relacionada con el hardware, donde no desea que se genere ninguna sobrecarga de llamada de función en la pila del lado de la persona que llama, ya que no va a regresar allí de todos modos.
Por ejemplo, al llamar a void main (void) desde el código de inicio de CRT dentro de un sistema integrado de microcontrolador: estos son sistemas que siguen funcionando hasta que conecta la alimentación y nunca volverán desde main() . Entonces, si el compilador para dicho sistema admite _Noreturn void main (void) , eso crea menos espacio de pila desperdiciado. De lo contrario, el CRT simplemente empujará x bytes en la pila que permanecerá allí para siempre, como espacio muerto.
También podría ser útil para fines de diagnóstico, como cuando se examina el comportamiento de los compiladores. Como se hizo aquí , al demostrar algunos errores importantes en el compilador clang.
No hay relación entre el tipo de retorno y un comportamiento "sin retorno" de la función.
El tipo de devolución void simplemente dice que esta función no devuelve ningún valor (en caso de que devuelva).
Algunas funciones nunca regresan a la persona que llama. Por ejemplo, algunos bucles infinitos de procesamiento de mensajes, la función exit() o las funciones para reemplazar el proceso actual (como la familia exec* ). El __attribute__((noreturn)) está insinuando al compilador que podría considerar cierta optimización para esta función específica que es válida para funciones que no devuelven, como optimizar la sobrecarga de llamar a dicha función (como guardar el contexto de la persona que llama, devolver dirección y tal).