Gibt es eine Möglichkeit, Ausnahmen in C ++ zu verwenden, die mich in addierter binärer Größe nicht 60k kosten?

9

Ich arbeite an einer eingebetteten Plattform, und es ist mir unangenehm, 60k zu meiner Binärdatei hinzuzufügen. Es gibt Argumente, Ausnahmen auf dem eingebetteten System sowieso zu vermeiden, aber ich denke, dass die meisten von ihnen unecht sind. Ausnahmen machen Sinn, aber ich kann die Kosten nicht so rechtfertigen, wie sie sind. Ich benutze gcc 4.6.3, vielleicht fehlt mir eine Option, oder vielleicht ist dies nur der Overhead von Ausnahmen. Ich habe -Os ausprobiert und die Ausnahmen zu longjmp geändert, aber ohne Erfolg. Ich könnte etwas verpasst haben.

Danke für jede Einsicht.

    
Kendrick Taylor 07.02.2013, 21:43
quelle

2 Antworten

2

Am ersten, nein!

Die Ausnahmebehandlung bringt einige Kosten mit sich, vor allem, weil die RTTI-Unterstützung hauptsächlich IMHO erfordert (dies wurde bisher nicht experimentell bewiesen). Die RTTI-Unterstützung führt zu einer gewissen Kostenverwendung des Textsegments Ihres Codes, insbesondere wenn viele Template-Instanziierungen durchgeführt werden (z. B. STL-Template-Klassen / Container-Klassen ausgiebig mit vielen verschiedenen Typen).

Auf der anderen Seite, im Vergleich zu anderen Möglichkeiten, z.B. newlib benötigte Implementierungen, die Kosten von 60k Overhead sind nicht so viel.

Sie sollten wirklich zweimal darüber nachdenken, die Ausnahmeunterstützung zuzulassen!

Lustig genug, ich habe dieses Thema heute mit meinen Kollegen besprochen, als wir einen Fehler sahen, der offensichtlich durch eine Situation mit zu wenig Speicher verursacht wurde. Die fragliche Firmware (und ihre Betriebssystembindungen an FreeRTOS) unterstützt keine Ausnahmen, aber die Speicherverwaltungsimplementierung würde eine Prozessorausnahme auslösen, wenn Sie mit new() keine bestimmte Menge an Heapspeicher erwerben können. Dies kann passieren, wenn ein STL-induzierter Algorithmus verwendet wird, und Sie haben keine Chance, dies mit einem try/catch Block bei einem Fehler abzufangen (z. B. Verwendung eines einfachen std::vector ).

Sie sollten also entscheiden, wie Sie Fehlersituationen handhaben können, ohne Ausnahmen zu verwenden oder nicht, und sicher zu sein, dass Sie ein konsistentes Verhalten z. für die Verwendung gängiger STL-Muster usw. und wägen Sie dies mit den Kosten ab, die Sie für .text Sektionsgröße zahlen.

    
πάντα ῥεῖ 07.02.2013 22:40
quelle
2

Sie können Ausnahmen in GCC deaktivieren, indem Sie -fno-exceptions verwenden.

Aber du kannst deinen Kuchen nicht essen und auch nicht essen. Das Deaktivieren von Ausnahmen bedeutet, dass Sie sie nicht abfangen können, und es wird auch unterbrochen, wenn Sie mit Code verknüpfen, der mit Ausnahmen kompiliert wurde. Aber es reduziert die binäre Größe, wie Sie es beabsichtigten.

Code ohne Ausnahmen (aber mit dem gleichen Grad der Fehlerprüfung) ist hässlich wie Sünde, aber es ist ein Preis, den Sie bezahlen müssen.

Hervorragendes Beispiel für einen fehlerfreien, robusten Code in C:)

%Vor%     
congusbongus 07.02.2013 22:58
quelle