Heim > Backend-Entwicklung > C++ > Wie funktionieren Ausnahmen intern in C?

Wie funktionieren Ausnahmen intern in C?

Linda Hamilton
Freigeben: 2024-10-24 07:32:02
Original
208 Leute haben es durchsucht

How Do Exceptions Operate Internally in C  ?

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:

  • __cxa_throw den Handler finden und den Stapel abwickeln muss.
  • Die zugewiesene Ausnahme muss zerstört werden, nachdem der Handler ausgeführt wurde .

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>
Nach dem Login kopieren

Generierte Assembly:

Das Kompilieren dieses Codes mit GCC unter Linux führte zu der folgenden Assembly-Ausgabe:

  1. Auslösen einer Ausnahme:

    _Z20my_throwing_functionb:
     ...
     movl    , (%esp)
     call    __cxa_allocate_exception
     ...
     movl    %eax, (%esp)
     call    __cxa_throw
     ...
    Nach dem Login kopieren
  2. Ausnahmebehandlungstabelle:

    .section    .gcc_except_table,&quot;a&quot;,@progbits
    .LLSDATT9:
     ...
     .uleb128 .LEHB1-.LFB9
     .uleb128 .LEHE1-.LEHB1
     .uleb128 .L12-.LFB9
     .uleb128 0x1
     ...
    Nach dem Login kopieren

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!

Quelle:php
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage