Jeśli funkcja zwraca bezwarunkowo _Noreturn
funkcji, kompilator będzie mógł zrozumieć, że:
- kod, który następuje, jest martwy kod, który pozwala na optymalizację (można go usunąć z wygenerowany binarny) i diagnostyka - kompilator będzie mógł emitować ostrzeżenia "nieosiągalny kod";
co najważniejsze, wiedząc, że normalny przepływ z funkcji zostanie przerwany, będzie mógł uniknąć fałszywych ostrzeżeń o brakujących wartościach zwracanych, niezainicjowanych zmiennych i tym podobnych.
Jest to szczególnie ważne ze statycznych analizatorów kodowych - liczba fałszywych alarmów podanych przez dzyń statycznych analizatora w biggish stosowania naszych spadła znacznie raz obchodziliśmy nasze die
funkcja (log błąd krytyczny i zamknąć aplikację) jako noreturn
.
Nie mogą być również niektóre inne optymalizację dostępnych - ponieważ funkcja nigdy nie powróci, nie ma potrzeby naciskać na adres zwrotny na stosie, zapisz stan rejestrów i cokolwiek, wszystko, co jest potrzebne, aby przekazać argumenty i wykonaj jmp
na początku funkcji, nie martwiąc się o powrót i oczyszczanie po zwrocie. Ale oczywiście, ponieważ połączenie jest jednorazowe, występ, który można tu wycisnąć, jest w większości znikomy.
http://stackoverflow.com/questions/10538291/what-is-the-point-of-the-noreturn-attribute zadaje to samo pytanie w języku C++. Rozumowanie C jest dokładnie takie samo. –
Rozumowanie jest podobne; składnia wydaje się być całkowicie różna między C++ ('[[noreturn]]') i C ('_Noreturn' lub' noreturn', jeśli zawarłeś ''). Tak więc uważam to za dobry x-ref; Nie jestem jednak pewien co do duplikacji. –
Nominuj do ponownego otwarcia, ponieważ dotyczy to C, a drugi dotyczy C++, dwóch zupełnie różnych języków. Rzeczywista składnia również jest bardzo różna. –