Se una funzione chiama incondizionatamente una funzione _Noreturn
, il compilatore sarà in grado di capire che:
- il codice che segue è codice morto, che consente di ottimizzare (può essere rimosso dal generato binario) e diagnostica: il compilatore sarà in grado di emettere un avviso di "codice non raggiungibile";
soprattutto, sapendo che il flusso normale dalla funzione viene interrotto, sarà in grado di evitare avvisi spuri su valori di ritorno mancanti, variabili non inizializzate e simili.
Ciò è particolarmente importante con analizzatori di codice statico - il numero di falsi positivi fornite dal analizzatore statico clang in un'applicazione biggish nostro è sceso notevolmente una volta che ha segnato la nostra die
funzione (log un errore fatale e terminare l'applicazione), come noreturn
.
Ci può essere anche qualche altro ottimizzazione disponibili - dal momento che la funzione non ritorna mai, non c'è bisogno di spingere l'indirizzo di ritorno sullo stack, salvare lo stato dei registri e quant'altro, tutto ciò che serve è quello di passare il argomenti e fare un jmp
all'inizio della funzione, senza preoccuparsi del ritorno e della pulizia post-ritorno. Ma ovviamente, dal momento che la chiamata è one-shot, la performance da spremere qui è per lo più trascurabile.
fonte
2012-12-03 20:48:54
http://stackoverflow.com/questions/10538291/what-is-the-point-of-the-noreturn-attribute fa la stessa domanda per C++. Il ragionamento per C è esattamente lo stesso. –
Il ragionamento è simile; la sintassi sembra essere totalmente diversa tra C++ ('[[noreturn]]') e C ('_Noreturn' o' noreturn' se hai incluso ''). Quindi, lo considererei un buon x-ref; Non sono sicuro dei duplicati, però. –
Nomina per riaprire perché si tratta di C, e l'altro riguarda C++, due lingue completamente diverse. Anche la sintassi attuale è molto diversa. –