In C++ ist der folgende CodeC++: Kann "versuchen {foo();} fangen (...) {werfen;}" auf "foo();" optimiert werden?
try {
foo();
} catch (...) {
throw;
}
semantisch identisch mit nur foo
wie diese nennen?
foo();
Wenn ja, kann ich eine state-of-the-art-Compiler erwarten, dass die erste Version auf der zweiten Version zu vermeiden (wenn mit Optimierung kompilieren aktiviert)?
Mit anderen Worten, wenn ich kompilieren diesen Code mit NDEBUG
und Optimierungen aktiviert
try {
foo();
} catch (...) {
assert(some_check());
throw;
}
kann ich davon ausgehen, dass es nie langsamer sein sollte, dass dieses hässliche Version
#ifndef NDEBUG
try {
#endif
foo();
#ifndef NDEBUG
} catch (...) {
assert(some_check());
throw;
}
#endif
[Nicht in der Praxis.] (Https://godbolt.org/g/kXdxf6) – Veedrac
Ich rate nur hier, aber wenn nichts in foo() eine Ausnahme auslöst, kann man davon ausgehen, dass der Compiler das machen kann Optimierung. – DeiDei
@DeiDei Wenn 'foo' nicht geworfen werden kann (und der Compiler das weiß, zB durch' noexcept'), wird der Compiler alle zugehörigen Exception-Handling-Zweige entfernen. Aber die Frage ist allgemeiner. – Veedrac