web-dev-qa-db-de.com

Was ist der Unterschied zwischen sjlj vs dwarf vs seh?

Ich kann nicht genügend Informationen finden, um zu entscheiden, mit welchem ​​Compiler ich mein Projekt kompilieren soll. Es gibt mehrere Programme auf verschiedenen Computern, die einen Prozess simulieren. Unter Linux verwende ich GCC. Alles ist großartig. Ich kann Code optimieren, er lässt sich schnell kompilieren und benötigt weniger Speicher.

Ich mache meinen eigenen Benchmark mit MSVC- und GCC-Compilern. Später erzeugt man etwas schnellere Binärdateien (für jede Unterarchitektur). Die Kompilierungszeit ist jedoch viel mehr als MSVC.

Also habe ich mich für MinGW entschieden. Ich kann jedoch keine Erklärung zu Ausnahmebehandlungsmethoden und deren Implementierung in MinGW finden. Ich kann verschiedene Distributionen für verschiedene Betriebssysteme und Architekturen verwenden.

Überlegungen:

  • Kompilierzeit und Speicher sind für meine Verwendung nicht wichtig. Wichtig ist nur die Laufzeitoptimierung. Ich brauche meine Programme, um schnell genug zu sein. Ein langsamer Compiler ist akzeptabel.
  • Betriebssystem: Microsoft Windows XP/7/8/Linux
  • Architektur: Intel Core i7/Core2/und ein sehr alter i686, auf dem XP: P
133
sorush-r

Es gibt eine kurze Übersicht unter MinGW-w64 Wiki :

Warum unterstützt mingw-w64 gcc die Behandlung von Dwarf-2-Ausnahmen nicht?

Die Dwarf-2 EH-Implementierung für Windows ist überhaupt nicht für 64-Bit-Windows-Anwendungen ausgelegt. Im Win32-Modus kann der Exception-Unwind-Handler keinen nicht Dw2-fähigen Code weitergeben. Dies bedeutet, dass alle Ausnahmen, die nicht Dw2-fähigen Code für "fremde Frames" durchlaufen, fehlschlagen, einschließlich Windows-System-DLLs und DLLs, die mit Visual Studio erstellt wurden. Der Code zum Abwickeln von Zwerg-2 in gcc überprüft die x86-Abwickelbaugruppe und kann ohne andere Informationen zum Abwickeln von Zwerg-2 nicht fortgesetzt werden.

Die SetJump LongJump Methode zur Ausnahmebehandlung funktioniert in den meisten Fällen sowohl auf Win32 als auch auf Win64, mit Ausnahme allgemeiner Schutzverletzungen. Es wird eine strukturierte Unterstützung für die Ausnahmebehandlung in gcc entwickelt, um die Schwächen von dw2 und sjlj zu überwinden. Auf win64 werden die Abwicklungsinformationen in xdata-section abgelegt und anstelle des Stapels befindet sich die .pdata (Funktionsdeskriptortabelle). Für win32 befindet sich die Handlerkette im Stapel und muss durch real ausgeführten Code gesichert/wiederhergestellt werden.

GCC GN about Ausnahmebehandlung:

GCC unterstützt zwei Methoden zur Ausnahmebehandlung (EH):

  • DWARF-2 (DW2) EH , für das die Verwendung von DWARF-2 (oder DWARF-3) -Debuginformationen erforderlich ist. DW-2 EH kann dazu führen, dass ausführbare Dateien leicht aufgebläht sind, da große Call-Stack-Abwickeltabellen in den ausführbaren Dateien enthalten sein müssen.
  • Eine Methode basierend auf setjmp/longjmp (SJLJ) . SJLJ-basierter EH ist viel langsamer als DW2-EH (was sogar die normale Ausführung beeinträchtigt, wenn keine Ausnahmen ausgelöst werden), kann jedoch für Code verwendet werden, der nicht mit GCC kompiliert wurde oder über keine Call-Stack-Abwicklungsinformationen verfügt.

[...]

Strukturierte Ausnahmebehandlung (SEH)

Windows verwendet einen eigenen Mechanismus zur Ausnahmebehandlung, den so genannten Structured Exception Handling (SEH). [...] Leider unterstützt GCC SEH noch nicht. [...]

Siehe auch:

97
ollo

[~ # ~] sjlj [~ # ~] (setjmp/longjmp): - verfügbar für 32 Bit und 64 Bit - nicht "Null-Kosten" : Selbst wenn eine Ausnahme nicht ausgelöst wird, führt dies zu einer geringfügigen Leistungsbeeinträchtigung (~ 15% in Code mit hoher Ausnahmekapazität) - ermöglicht das Durchlaufen von Ausnahmen, z Windows-Rückrufe

[~ # ~] Zwerg [~ # ~] (DW2, Zwerg-2) - nur für 32-Bit verfügbar - kein permanenter Laufzeit-Overhead - muss vollständig sein Call-Stack für Zwerge aktiviert sein, was bedeutet, dass Ausnahmen nicht übergangen werden können, z Windows-System-DLLs.

[~ # ~] seh [~ # ~] (keine Overhead-Ausnahme) - wird für 64-Bit-GCC 4.8 verfügbar sein.

source: http://qt-project.org/wiki/MinGW-64-bit

73
user2127352