Jerry sagte: ... das Ergebnis ist nicht ganz C ++ mehr , während meine Metapher ist , dass es ist klar C ++, nur ein etwas anderer Dialekt , weil Programme andere Formen verwenden, Konventionen und geschrieben Stile.
Hier sind meine Hauptgründe für die Deaktivierung:
Binäre Kompatibilität
Das Überschreiten von Sprach- und Übersetzungsgrenzen ist nicht allgemein definiert oder undefiniert. Wenn Sie sicherstellen möchten, dass Ihr Programm im Bereich des definierten Verhaltens ausgeführt wird, müssen Sie Ausnahmen an Modul-Exit-Punkten unter Quarantäne stellen.
Ausführbare Größe
Hier sind die Binärgrößen eines ausnahmefreien Programms, das ich ohne und mit aktivierten Ausnahmen geschrieben habe:
Ohne Ausnahmen:
- ausführbare + Abhängigkeiten: 330
- endgültige entfernte ausführbare Datei (Release Build): 37
Mit Ausnahmen:
- ausführbare + Abhängigkeiten: 380
- endgültige entfernte ausführbare Datei (Release Build): 44
Erinnerung: Dies ist eine Sammlung von Bibliotheken und Programmen, die keine Throws / Catches enthalten. Der Compiler - Flag tut Ausnahmen in der Standardbibliothek C ++ ermöglichen. Daher betragen die Kosten in der realen Welt in diesem Beispiel mehr als 19%.
Compiler: apple gcc4.2 + llvm. Größen in MB.
Geschwindigkeit
Trotz des Begriffs "Null-Kosten-Ausnahmen" erhöhen sie den Overhead, auch wenn nie etwas anfällt. Im obigen Fall handelt es sich um ein leistungskritisches Programm (Signalverarbeitung, Generierung, Präsentation, Konvertierung, mit großen Datenmengen / Signalen usw.). Ausnahmen sind in diesem Design nicht erforderlich, während die Leistung sehr wichtig ist.
Programmkorrektheit
Scheint ein seltsamer Grund zu sein ... Wenn das Werfen keine Option ist, müssen Sie relativ strenge, korrekte und gut getestete Programme schreiben, um sicherzustellen, dass Ihr Programm korrekt ausgeführt wird und die Clients die Schnittstellen korrekt verwenden (wenn Sie mir ein schlechtes Argument geben oder dies tun) Überprüfen Sie keinen Fehlercode, dann verdienen Sie UB). Das Ergebnis? Die Implementierungsqualität wird erheblich verbessert und Probleme werden schnell behoben.
Einfachheit
Implementierungen zur Ausnahmebehandlung werden häufig nicht auf dem neuesten Stand gehalten. Sie erhöhen auch die Komplexität, da eine Implementierung viele, viele Exit-Sequenzen haben kann. Es ist einfacher, hochkomplexe Programme zu lesen und zu warten, wenn sie einen kleinen Satz gut definierter, typisierter Exit-Strategien verwenden, die dem Client zuwiderlaufen und vom Client gehandhabt werden. In anderen Fällen können die Implementierungen im Laufe der Zeit mehr Throws implementieren, oder ihre Abhängigkeiten können sie einführen. Kunden können sich nicht einfach oder angemessen gegen all diese Ausgänge verteidigen. Ich schreibe und aktualisiere viele Bibliotheken, es gibt häufige Entwicklungen und Verbesserungen. Der Versuch, dies alles mit den Exit-Sequenzen von Ausnahmen (in einer großen Codebasis) synchron zu halten, wäre kein guter Zeitgewinn und würde wahrscheinlich viel Lärm und Kruft verursachen. Durch erhöhte Programmkorrektheit und mehr Tests
Verlauf / bestehender Code
In einigen Fällen wurden sie aus historischen Gründen nie eingeführt. Eine vorhandene Codebasis hat sie nicht verwendet. Das Ändern der Programme kann Jahre dauern und die Wartung aufgrund von Überschneidungen bei Konventionen und Implementierungen sehr hässlich machen.
Nachteile
Natürlich gibt es Nachteile, die größten sind: Inkompatibilität (einschließlich Binärdateien) mit anderen Bibliotheken und die Tatsache, dass Sie eine gute Anzahl von Programmen implementieren müssen, um dieses Modell zu erfüllen.