Die Implementierungen können sich unterscheiden, aber es gibt einige grundlegende Ideen, die sich aus den Anforderungen ergeben.
Das Ausnahmeobjekt selbst ist ein Objekt, das in einer Funktion erstellt und in dem aufrufenden Funktionsaufruf zerstört wird. Daher ist es in der Regel nicht möglich, das Objekt auf dem Stapel zu erstellen. Andererseits sind viele Ausnahmeobjekte nicht sehr groß. Daher kann man z. B. einen 32-Byte-Puffer erstellen und bei Bedarf auf den Heap überlaufen, wenn ein größeres Ausnahmeobjekt tatsächlich benötigt wird.
Was die tatsächliche Kontrollübertragung betrifft, gibt es zwei Strategien. Eine besteht darin, ausreichend Informationen im Stapel selbst zu erfassen, um den Stapel aufzuheben. Dabei handelt es sich im Wesentlichen um eine Liste von Destruktoren, die ausgeführt werden sollen, und um Ausnahmebehandler, die die Ausnahme abfangen könnten. Wenn eine Ausnahme auftritt, wird der Stapel zurückverfolgt und die Destruktoren werden ausgeführt, bis ein passendes Catch gefunden wird.
Die zweite Strategie verschiebt diese Informationen in Tabellen außerhalb des Stapels. Wenn also eine Ausnahme auftritt, wird der Aufrufstapel verwendet, um festzustellen, in welche Gültigkeitsbereiche eingetreten, aber nicht verlassen wurden. Diese werden dann in den statischen Tabellen nachgeschlagen, um festzustellen, wo die geworfene Ausnahme behandelt werden soll und welche Destruktoren dazwischen ausgeführt werden sollen. Dies bedeutet, dass weniger Ausnahmeaufwand auf dem Stapel erfolgt; Rückkehradressen sind sowieso erforderlich. Die Tabellen sind zusätzliche Daten, aber der Compiler kann sie in einem nach Bedarf geladenen Segment des Programms platzieren.
5 Stimmen
Lesen Sie diesen Artikel wird Ihnen helfen.
0 Stimmen
Ich weiß es nicht - aber ich vermute, dass die C++ Spezifikation eine klare Definition hat. (Ich könnte aber auch falsch liegen)
2 Stimmen
Nein, die Spezifikation gibt keine Definition. Sie diktiert das Verhalten, nicht die Implementierung. Paul, du solltest angeben, an welcher Implementierung du interessiert bist.
1 Stimmen
Verwandte Frage: stackoverflow.com/questions/307610/…
0 Stimmen
Siehe Abschnitt 5.4 des Technischen Berichts zur Leistung von C++