c++ - with - В чем смысл нореткин?



function could be declared with attribute noreturn (4)

[dcl.attr.noreturn] предоставляет следующий пример:

[[ noreturn ]] void f() {
    throw "error";
    // OK
}

но я не понимаю, в чем смысл [[noreturn]] , потому что возвращаемый тип функции уже void .

Итак, в чем noreturn атрибута noreturn ? Как он должен использоваться?

https://code.i-harness.com


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

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


Предыдущие ответы правильно объяснили, что такое noreturn, но не почему это существует. Я не думаю, что комментарии «оптимизации» являются основной целью: функции, которые не возвращаются, редки и обычно не нуждаются в оптимизации. Скорее, я думаю, что основным смыслом норэртнуна является предотвращение ложноположительных предупреждений. Например, рассмотрите этот код:

int f(bool b){
    if (b) {
        return 7;
    } else {
        abort();
    }
 }

Если бы abort () не был помечен как «noreturn», компилятор мог бы предупредить об этом коде, имеющем путь, где f не возвращает целое число, как ожидалось. Но из-за того, что abort () не возвращается, он знает, что код верен.


Это означает, что функция не будет завершена. Поток управления никогда не удастся выполнить оператор после вызова f() :

void g() {
   f();
   // unreachable:
   std::cout << "No! That's impossible" << std::endl;
}

Информация может использоваться компилятором / оптимизатором по-разному. Компилятор может добавить предупреждение о том, что приведенный выше код недоступен, и он может модифицировать фактический код g() различными способами, например, для поддержки продолжений.


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





noreturn