В C++, следующий кодC++: Может ли "try {foo();} catch (...) {throw;}" быть оптимизирован для "foo();"?
try {
foo();
} catch (...) {
throw;
}
семантически идентичны просто звоню foo
, как это?
foo();
Если да, то я могу ожидать внедренный компилятор, чтобы избежать первой версии до второй версии (при компиляции с оптимизацией включена)?
Другими словами, если я скомпилировать этот код с NDEBUG
и оптимизации позволили
try {
foo();
} catch (...) {
assert(some_check());
throw;
}
я могу предположить, что он никогда не должен быть медленнее, что это некрасиво версия
#ifndef NDEBUG
try {
#endif
foo();
#ifndef NDEBUG
} catch (...) {
assert(some_check());
throw;
}
#endif
[Не на практике.] (Https://godbolt.org/g/kXdxf6) – Veedrac
Я только угадываю здесь, но если ничего внутри foo() не генерирует исключение, можно с уверенностью предположить, что компилятор может сделать это оптимизация. – DeiDei
@DeiDei Если 'foo' не может выбрасывать (и компилятор знает это, например, через' noexcept'), компилятор удалит все связанные ветви обработки исключений. Но вопрос более общий. – Veedrac