C++ - Ausnahme overhead
Warum machen die embedded-Plattform-Entwickler kontinuierlich zu entfernen versuchen, die Nutzung C++ exceptions
aus Ihrer SDKs
?
Beispielsweise Bada SDK
schlägt folgenden workaround für die Ausnahme-Nutzung, die sieht außergewöhnlich ugly:
result
MyApp::InitTimer()
{
result r = E_SUCCESS;
_pTimer = new Timer;
r = _pTimer->Construct(*this);
if (IsFailed(r))
{
goto CATCH;
}
_pTimer->Start(1000);
if (IsFailed(r))
{
goto CATCH;
}
return r;
CATCH:
return r;
}
Was sind die Gründe für dieses Verhalten?
Soweit ich weiß, ARM
Compiler vollständig unterstützt C++ exceptions
- und das konnte eigentlich nicht sein, die Materie. Was sonst? Ist der Aufwand der exception-Nutzung und unwindings auf ARM
Plattformen wirklich, dass GROßEN verbringen viel Zeit damit, solche workarounds?
Vielleicht etwas anderes ich bin mir nicht bewusst?
Danke.
- +1 für beschreibt Sie als außergewöhnlich hässlich...
- Ein großer Grund ist alt-code. Wenn code geschrieben wird, Ausnahme, von Anfang an sicher es ist nicht exception-sicher. Dies ist eine von Googles großen Gründe, warum Sie nicht verwenden, Ausnahmen: nicht mit zu beginnen, jetzt sind wir irgendwie steckengeblieben mit dieser Entscheidung.
- Ich würde vorschlagen, die änderung der "usage" - tag (das scheint wie eine nicht-op zu mir) "embedded".
- Meinst du "warum machen Sie keine Ausnahmen zulassen in der Plattform" oder "warum machen die Leute nicht Ausnahmen" in einer mehr Allgemeinen Art und Weise? Für die ehemaligen, deaktivieren Ausnahmen ist ein Weg zur Gewährleistung der Kompatibilität mit Plattformen, über die "Embedded C++" Teilmenge. en.wikipedia.org/wiki/Embedded_C%2B%2B
- Viele Antworten hier. Es war ein post speziell über Ausnahmen.
setjmp()
undlongjmp()
mehr kontrolliert. Jedes Objekt bekommt oft eingegeben, in der Ausnahme von Tabellen und herauszufinden, die Tabelle in eine pro-Datei, die Zusammenstellung ist nicht optimal. Normalerweise ist dies nicht ein Schmerz, wenn er sitzt auf der Festplatte. Embedded-Anwendungen oft nicht über eine Festplatte. Auch heute noch (2013),g++
Entwickler versuchen immer noch, um diese zu optimieren Tabellen. Sie können so groß wie der code in einigen Fällen!
InformationsquelleAutor Yippie-Ki-Yay | 2011-07-13
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denken kann ein paar mögliche Gründe:
Just my 2 cents...
Ich berate ausschließlich auf embedded-Systemen, die meisten von Ihnen in harter Echtzeit und/oder die Sicherheit/das Leben entscheidend. Die meisten von Ihnen laufen in 256K flash/ROM-oder weniger - in anderen Worten, diese sind nicht "PC-like" - VME-bus-Systeme mit 1GB+ RAM/flash und einem 1GHz+ CPU. Sie sind tief eingebettet, etwas ressourcenbeschränkte Systeme.
Ich würde sagen, mindestens 75% der Produkte, die die C++ - deaktivieren Sie die Ausnahmen bei den compiler (d.h. der code kompiliert mit dem compiler-Schalter, deaktivieren Sie die Ausnahmen). Ich Frage immer nach, warum. Ob Sie es glauben oder nicht, die häufigste Antwort ist NICHT die Laufzeit-oder Speicher-Aufwand /Kosten.
Die Antworten sind in der Regel eine gewisse Mischung aus:
Auch - es gibt oft einige nebulöse Unsicherheit/Angst über overhead, aber fast immer ist es unquantified /unprofilierten, es ist einfach eine Art auf den Markt geworfen & genommen am Nennwert. Ich kann Ihnen zeigen, Berichte /Artikel, die besagen, dass der overhead von Ausnahmen ist 3%, 10%-15%, oder ~30% - nehmen Sie Ihre pick. Menschen neigen dazu, zu zitieren, die Figur, die nach vorn aus Ihrer jeweiligen Sicht. Fast immer, der Artikel ist veraltet, die Plattform/toolset ist völlig anders, etc. so wie Roddy sagt, Sie müssen Messen Sie sich auf Ihrer Plattform.
Ich bin nicht unbedingt verteidigen alle diese Positionen, ich bin nur geben Sie der realen Welt feedback /Erklärungen, die ich gehört habe von vielen Firmen arbeiten mit C++ auf embedded-Systemen, da deine Frage "warum so viele embedded-Entwickler vermeiden-Ausnahmen?"
Ich denke, es ist vor allem FUD, in diesen Tagen.
Ausnahmen haben einen geringen overhead bei der ein-und Ausfahrt zu den Blöcken, die erstellen Objekte, Konstruktoren/Destruktoren, aber das sollte wirklich nicht belaufen sich auf eine Dose Bohnen, die in den meisten Fällen.
Messen erste, zweite Optimieren.
Jedoch, eine Ausnahme zu werfen, ist in der Regel langsamer als Rückgabe nur einen boolean-flag, so Ausnahmen für außergewöhnliche Ereignisse, die nur.
In einem Fall habe ich gesehen, dass das RTL war, konstruieren gesamte druckbare stack-traces von Symboltabellen, wenn eine Ausnahme geworfen wurde Potenzial für das Debuggen verwenden. Wie Sie sich vorstellen können, dies war Nicht eine Gute Sache. Das war ein paar Jahre zurück, und die debugging-library wurde Flugs behoben, wenn dies ans Licht kam.
Aber, IMO, die Zuverlässigkeit, die Sie gewinnen können, von der richtigen Nutzung der Ausnahmen überwiegt bei weitem die geringfügigen Leistungseinbußen. Verwenden Sie Sie, aber vorsichtig.
Edit:
@jalf macht einige gute Punkte, und meine obige Antwort war gezielt auf die Verwandte Frage, warum viele embedded - Entwickler im Allgemeinen noch zu verunglimpfen Ausnahmen.
Aber, wenn der Entwickler von einer bestimmten Plattform-SDK sagt "nicht verwenden, Ausnahmen", würden Sie wahrscheinlich haben, um mit zu gehen, dass. Vielleicht gibt es Besondere Probleme, mit Ausnahme der Umsetzung in Ihrer Bibliothek oder compiler - oder vielleicht sind Sie besorgt über Ausnahmen in den in-Rückrufe verursacht Probleme durch fehlende exception-Sicherheit in Ihren eigenen code.
Diese Haltung auf Ausnahmen hat das nichts zu tun, was auch immer mit Leistung oder compiler zu unterstützen und alles zu tun mit einer Idee, die Ausnahmen die Komplexität der code.
Diese Idee, soweit ich das beurteilen kann, ist fast immer ein Missverständnis, aber es scheint mächtige Befürworter für einige undenkbar Grund.
Einer Stellungnahme an das Gegenteil von "gotos sind böse", die in den anderen Antworten. Ich mache das community-wiki, weil ich weiß, dass dies entgegen der Stellungnahme wird geflamed.
Jede Echtzeit-Programmierer Wert Ihr Salz weiß, dass diese Nutzung von
goto
. Es ist eine weit verbreitete und allgemein akzeptierte Mechanismus für die Behandlung von Fehlern. Viele harte Echtzeit-Programmier-Umgebungen nicht einsetzen < setjmp.h >. Ausnahmen sind konzeptionell nur eingeschränkte Versionen vonsetjmp
undlongjmp
. Warum also Ausnahmen, wenn der zugrunde liegende Mechanismus ist verboten?Einer Umgebung kann Ausnahmen zulassen, wenn alle geworfen Ausnahmen können garantiert immer lokal behandelt werden. Die Frage ist, warum tun Sie dies? Die einzige Rechtfertigung ist, dass gotos sind immer böse. Gut, Sie sind nicht immer böse.
Modernen C++ - compiler kann die Laufzeit verringert werden, die Nutzung der Ausnahme von weniger als 3% overhead. Noch, wenn die extreme-Programmierer finden es teuer dann würden Sie gegriffen haben, um solche schmutzigen tricks.
Hier sehen Bjarne Strourstrup der Seite für, Warum Ausnahmen ?