===================== Ausnahmenbehandlungen [TOC] ===================== Ausnahmenbehandlungen sind in ihrer Implementierung inhärent teuer, da der Aufrufer einer Funktion oder Methode sich für den Fall vorbereiten muss, dass das Stacksegment für den umgebenden Block im Rahmen einer Ausnahmenbehandlung abgebaut werden muss. Ein wichtiges Optimierungspotential wird daher gewonnen, wenn die Signatur einer Funktion oder Methode explizit mit dem Schlüsselwort `noexcept` zusichert, dass keine Ausnahmen erfolgen. Hierzu gibt es ein paar einfache Grundregeln: * Jede Funktion oder Methode ist entweder mit `noexcept` deklariert oder es muss davon ausgegangen werden, dass es zu Ausnahmen kommt. * Elementare Operationen auf elementaren Datentypen führen nicht zu Ausnahmen. Insbesondere führt das Teilen durch 0 nicht zu einer Ausnahmenbehandlung, sondern, je nach Implementierung, etwa zu Signalen oder zu speziellen Werten entsprechend dem IEEE-754-Standard. * Das Belegen von Speicher mit `new` kann zu einer Ausnahme führen. Die Freigabe von Speicher mit `delete` ist `noexcept`. Ein _destructor_ kann aber sehr wohl eine Ausnahme auslösen, wenngleich dies eher zu vermeiden ist. * Destruktoren sind implizit `noexcept` deklariert. Sollte der Abbau tatsächlich eine Ausnahme erzeugen können, ist der Destruktor mit `noexcept(false)` zu deklarieren. Aufgabe ======= Nehmen Sie die Array-Klasse aus der vierten Übungssitzung und ergänzen Sie diese mit `noexcept` überall, wo es zweifellos zulässig ist. Bedenken Sie, dass _assert_ aus `#include ` leider nicht als `noexcept` anzusehen ist, obwohl es sich um eine Funktion handelt, die bei einem Abbruch normalerweise keine Ausnahmenbehandlung auslöst, sondern eben `std::abort` aufruft, das interessanterweise als `noexcept` deklariert ist. Vorlage ======= :import: session04/step05/array.hpp [fold] :import: session04/step05/test1.cpp [fold] :navigate: up -> doc:index next -> doc:session07/page02