Wie Ausnahmen hinter den Kulissen in C funktionieren
Einführung:
Ausnahmen werden oft in Frage gestellt für ihre Effizienz. In diesem Artikel wird die komplizierte Funktionsweise von Ausnahmen in C untersucht, um ein umfassendes Verständnis ihres Ausführungsprozesses zu vermitteln.
Ausnahmebehandlungsmechanismus:
Ausnahmen sind nicht direkt mit der wiederholten Ausführung vergleichbar kehrt zurück; sie beinhalten eine zusätzliche Schicht von Ausnahmetabellen. Wenn eine Ausnahme ausgelöst wird, generiert der Compiler einen Aufruf von __cxa_throw, der diese Tabellen verwendet, um den Handler zu finden und den Stapel abzuwickeln, bis er den entsprechenden Handler erreicht.
Auslösen einer Ausnahme:
Das Auslösen einer Ausnahme erfordert einen erheblichen Laufzeitaufwand, weil:
Außergewöhnliche Rückgaben:
Im Gegensatz dazu verursacht die Rückgabe eines Werts nur minimalen Overhead. Ausnahmen sollten sparsam und nur für Ausnahmeszenarien verwendet werden.
Beispielcode:
Der folgende vereinfachte C-Code veranschaulicht die Befehlsgenerierung für die Ausnahmebehandlung:
<code class="cpp">class MyException { public: MyException() { } ~MyException() { } }; void my_throwing_function(bool throwit) { if (throwit) throw MyException(); } void another_function(); void log(unsigned count); void my_catching_function() { log(0); try { log(1); another_function(); log(2); } catch (const MyException& e) { log(3); } log(4); }</code>
Generierte Assembly:
Das Kompilieren dieses Codes mit GCC unter Linux führte zu der folgenden Assembly-Ausgabe:
Auslösen einer Ausnahme:
_Z20my_throwing_functionb: ... movl , (%esp) call __cxa_allocate_exception ... movl %eax, (%esp) call __cxa_throw ...
Ausnahmebehandlungstabelle:
.section .gcc_except_table,"a",@progbits .LLSDATT9: ... .uleb128 .LEHB1-.LFB9 .uleb128 .LEHE1-.LEHB1 .uleb128 .L12-.LFB9 .uleb128 0x1 ...
Schlussfolgerung:
Ausnahmen erfordern erhebliche Overhead für die Handhabung und Abwicklung, während Rückgabewerte nur minimale Kosten verursachen. Ausnahmen sind optimal für Ausnahmeszenarien, sollten jedoch mit Bedacht eingesetzt werden, um Leistungseinbußen zu vermeiden.
Das obige ist der detaillierte Inhalt vonWie funktionieren Ausnahmen intern in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!