Eine No-Throw-Spezifikation für eine Inline-Funktion, die nur eine Mitgliedsvariable zurückgibt und möglicherweise keine Ausnahmen auslösen kann, kann von einigen Compilern verwendet werden, um Pessimierungen durchzuführen (ein erfundenes Wort für das Gegenteil von Optimierungen), die sich nachteilig auf die Leistung auswirken können. Dies ist in der Boost-Literatur beschrieben: Ausnahmespezifikation
Bei einigen Compilern kann eine No-Throw-Spezifikation für Nicht-Inline-Funktionen von Vorteil sein, wenn die richtigen Optimierungen vorgenommen werden und die Verwendung dieser Funktion die Leistung in einer Weise beeinflusst, die dies rechtfertigt.
Für mich klingt es so, als ob die Verwendung ein Aufruf eines sehr kritischen Auges im Rahmen einer Leistungsoptimierung ist, möglicherweise mithilfe von Profiling-Tools.
Ein Zitat aus dem obigen Link für diejenigen, die es eilig haben (enthält ein Beispiel für schlechte unbeabsichtigte Auswirkungen der Angabe eines Wurfs auf eine Inline-Funktion eines naiven Compilers):
Begründung der Ausnahmespezifikation
Ausnahmespezifikationen [ISO 15.4] werden manchmal codiert, um anzugeben, welche Ausnahmen ausgelöst werden können, oder weil der Programmierer hofft, dass sie die Leistung verbessern. Betrachten Sie jedoch das folgende Element anhand eines intelligenten Zeigers:
T & operator * () const throw () {return * ptr; }}
Diese Funktion ruft keine anderen Funktionen auf. Es werden nur grundlegende Datentypen wie Zeiger bearbeitet. Daher kann niemals ein Laufzeitverhalten der Ausnahmespezifikation aufgerufen werden. Die Funktion ist vollständig dem Compiler zugänglich. In der Tat wird es als Inline deklariert. Daher kann ein intelligenter Compiler leicht ableiten, dass die Funktionen keine Ausnahmen auslösen können, und dieselben Optimierungen vornehmen, die er basierend auf der leeren Ausnahmespezifikation vorgenommen hätte. Ein "dummer" Compiler kann jedoch alle Arten von Pessimierungen vornehmen.
Beispielsweise deaktivieren einige Compiler das Inlining, wenn eine Ausnahmespezifikation vorliegt. Einige Compiler fügen Try / Catch-Blöcke hinzu. Solche Pessimierungen können eine Leistungskatastrophe sein, die den Code in praktischen Anwendungen unbrauchbar macht.
Obwohl eine Ausnahmespezifikation zunächst ansprechend ist, hat sie tendenziell Konsequenzen, deren Verständnis sehr sorgfältige Überlegungen erfordert. Das größte Problem bei Ausnahmespezifikationen besteht darin, dass Programmierer sie so verwenden, als hätten sie den Effekt, den der Programmierer haben möchte, anstatt den Effekt, den sie tatsächlich haben.
Eine Nicht-Inline-Funktion ist die einzige Stelle, an der eine Ausnahmespezifikation "wirft nichts" bei einigen Compilern einige Vorteile haben kann.