Имеет ли смысл добавлять [[noreturn]] в основную функцию

Насколько я понимаю, атрибут C ++ [[noreturn]] может применяться к функциям, не возвращающимся к вызывающей стороне, чтобы компилятор мог генерировать более оптимизированный код. Я понимаю, что это имеет значение для «нормальных» функций, но мне было интересно, если это также имеет значение в производительности при применении его к main функция.

Предполагая, что я хочу написать программу, работающую постоянно без шансов на ее прерывание ( main функция никогда не вернется к вызывающей стороне (= операционная система)

Что из этого приводит к более быстрому (более оптимизированному) коду или вообще ничего не меняет?

Опция 1:

int main()
{
while(true)
//..
return 0;
}

Вариант 2:

[[noreturn]] int main()
{
while(true)
//..
return 0;
}

3

Решение

noreturn в основном полезно для вызывающих функций, а не для самих функций, а в случае main() вызывающий main() это среда выполнения C ++, которая уже готова, поэтому компилятор не может ее скомпилировать, поэтому оптимизировать там нечего.

Тем не менее, в вашем main()поскольку теоретически noreturn Версия будет производить немного меньший код, так как компилятор может опустить последовательность инструкций, известную как эпилог.

Это увеличение производительности (скорости / размера) тривиально, и не стоит обращать на него особого внимания. Что более интересно, так это возможность получить предупреждение, если вы написали какой-либо код сразу после вызова noreturn функция. В этом случае компилятор должен предупредить вас, что этот ваш код никогда не будет выполнен. Я считаю это намного более полезным.

3

Другие решения

Предполагается, что атрибут noreturn используется для функций, которые не возвращаются вызывающей стороне. Это не означает, что void функции (которые возвращают вызывающей стороне — они просто не возвращают значение), но функции, в которых поток управления не вернется к вызывающей функции после завершения функции (например, функции, которые выходят из приложения, цикл навсегда или бросить исключение).

Это может использоваться компиляторами для оптимизации и генерирования более качественных предупреждений. Например, если f имеет атрибут noreturn, компилятор может предупредить вас о том, что g () является мертвым кодом, когда вы пишете f (); г();. Точно так же компилятор будет знать, что не должен предупреждать вас о пропущенных операторах возврата после вызовов f ().

от Какой смысл в noreturn?

РЕДАКТИРОВАТЬ:

четко ответить на почту. Я думаю, что есть небольшая выгода от использования возврата в основном, но это плохая практика. В C / C ++ по «соглашению», если все работает хорошо, вы должны return 0; в твоем главном

1

По вопросам рекламы [email protected]