Ответ 1
Если функция безоговорочно вызывает функцию _Noreturn
, компилятор сможет понять, что:
- следующий код - это мертвый код, который позволяет оптимизировать (его можно удалить из сгенерированного двоичного кода) и диагностики - компилятор сможет выпустить предупреждения "недопустимый код";
-
Самое главное, зная, что нормальный поток от функции прерывается, он сможет избежать ложных предупреждений о недостающих возвращаемых значениях, неинициализированных переменных и т.п.
Это особенно важно для анализаторов статического кода - количество ложных срабатываний, заданных статическим анализатором CLang в приложении Biggish, значительно сократилось после того, как мы отметили нашу функцию
die
(зарегистрируем фатальную ошибку и завершим приложение) какnoreturn
.
Там может быть и другая доступная оптимизация - поскольку функция никогда не возвращается, нет необходимости нажимать адрес возврата в стеке, сохранять состояние регистров и т.д., все, что необходимо, - это передать аргументы и выполнить jmp
до начала функции, не беспокоясь о возврате и очистке после возврата. Но, конечно, поскольку вызов одноразовый, производительность для сжатия здесь в основном незначительна.