Насколько я понимаю, атрибут C ++ [[noreturn]]
может применяться к функциям, не возвращающимся к вызывающей стороне, чтобы компилятор мог генерировать более оптимизированный код. Я понимаю, что это имеет значение для «нормальных» функций, но мне было интересно, если это также имеет значение в производительности при применении его к main
функция.
Предполагая, что я хочу написать программу, работающую постоянно без шансов на ее прерывание ( main
функция никогда не вернется к вызывающей стороне (= операционная система)
Что из этого приводит к более быстрому (более оптимизированному) коду или вообще ничего не меняет?
Опция 1:
int main()
{
while(true)
//..
return 0;
}
Вариант 2:
[[noreturn]] int main()
{
while(true)
//..
return 0;
}
noreturn
в основном полезно для вызывающих функций, а не для самих функций, а в случае main()
вызывающий main()
это среда выполнения C ++, которая уже готова, поэтому компилятор не может ее скомпилировать, поэтому оптимизировать там нечего.
Тем не менее, в вашем main()
поскольку теоретически noreturn
Версия будет производить немного меньший код, так как компилятор может опустить последовательность инструкций, известную как эпилог.
Это увеличение производительности (скорости / размера) тривиально, и не стоит обращать на него особого внимания. Что более интересно, так это возможность получить предупреждение, если вы написали какой-либо код сразу после вызова noreturn
функция. В этом случае компилятор должен предупредить вас, что этот ваш код никогда не будет выполнен. Я считаю это намного более полезным.
Предполагается, что атрибут noreturn используется для функций, которые не возвращаются вызывающей стороне. Это не означает, что void функции (которые возвращают вызывающей стороне — они просто не возвращают значение), но функции, в которых поток управления не вернется к вызывающей функции после завершения функции (например, функции, которые выходят из приложения, цикл навсегда или бросить исключение).
Это может использоваться компиляторами для оптимизации и генерирования более качественных предупреждений. Например, если f имеет атрибут noreturn, компилятор может предупредить вас о том, что g () является мертвым кодом, когда вы пишете f (); г();. Точно так же компилятор будет знать, что не должен предупреждать вас о пропущенных операторах возврата после вызовов f ().
РЕДАКТИРОВАТЬ:
четко ответить на почту. Я думаю, что есть небольшая выгода от использования возврата в основном, но это плохая практика. В C / C ++ по «соглашению», если все работает хорошо, вы должны return 0;
в твоем главном