web-dev-qa-db-fra.com

Quelle est la difference entre sjlj vs dwarf vs seh?

Je ne trouve pas assez d'informations pour choisir le compilateur à utiliser pour compiler mon projet. Il existe plusieurs programmes sur différents ordinateurs simulant un processus. Sous Linux, j'utilise GCC. Tout est bon. Je peux optimiser le code, il compile rapidement et utilise peu de mémoire.

Je fais mes propres tests avec les compilateurs MSVC et GCC. Plus tard, on produit des fichiers binaires légèrement plus rapides (pour chaque sous-architecture). Bien que le temps de compilation soit bien plus que MSVC.

J'ai donc décidé d'utiliser MinGW. Mais vous ne trouvez aucune explication sur les méthodes de traitement des exceptions et leurs implémentations dans MinGW. Je peux utiliser différentes distributions pour différents systèmes d'exploitation et architectures.

Considérations:

  • Le temps de compilation et la mémoire ne sont pas importants pour mon utilisation. La seule chose importante est l'optimisation de l'exécution. J'ai besoin que mes programmes soient assez rapides. Un compilateur lent est acceptable.
  • Système d'exploitation: Microsoft Windows XP/7/8/Linux
  • Architecture: Intel Core i7/Core2/et un très vieil i686 fonctionnant sous XP: P
133
sorush-r

Il y a un bref aperçu sur Wiki MinGW-w64 :

Pourquoi mingw-w64 gcc ne supporte-t-il pas la gestion des exceptions Dwarf-2?

L'implémentation Dwarf-2 EH pour Windows n'est pas conçue pour fonctionner sous des applications Windows 64 bits. En mode win32, le gestionnaire d'exception de déroulement ne peut pas se propager via un code non compatible dw2. Cela signifie que toute exception passant par un code "cadres étrangers" non compatible avec dw2 échouera, y compris les DLL système Windows et les bibliothèques créées avec Visual Studio. Le code de déroulement de Dwarf-2 dans gcc inspecte l’ensemble de déroulement x86 et ne peut pas continuer sans les autres informations de déroulement de nain-2.

La méthode SetJump LongJump de gestion des exceptions fonctionne dans la plupart des cas sur win32 et win64, à l'exception des erreurs de protection générales. Un support structuré de traitement des exceptions dans gcc est en cours de développement afin de remédier aux faiblesses de dw2 et de sjlj. Sur win64, les informations de déroulement sont placées dans xdata-section et il y a le .pdata (table de descripteur de fonction) à la place de la pile. Pour win32, la chaîne de gestionnaires est sur la pile et doit être sauvegardée/restaurée avec du code réellement exécuté.

GCC GN environ Gestion des exceptions :

GCC prend en charge deux méthodes de gestion des exceptions (EH):

  • DWARF-2 (DW2) EH , qui nécessite l’utilisation des informations de débogage DWARF-2 (ou DWARF-3). DW-2 EH peut entraîner une légère surcharge des exécutables car des tables de déroulement de pile d'appels volumineuses doivent être incluses dans les exécutables.
  • Une méthode basée sur setjmp/longjmp (SJLJ) . EH basé sur SJLJ est beaucoup plus lent que DW2 EH (pénalisant même l'exécution normale lorsqu'aucune exception n'est levée), mais peut fonctionner avec du code qui n'a pas été compilé avec GCC ou pour lequel aucune information de déroulement de pile d'appels ne s'est produite.

[...]

Traitement structuré des exceptions (SEH)

Windows utilise son propre mécanisme de gestion des exceptions appelé SEH (Structured Exception Handling). [...] Malheureusement, GCC ne supporte pas encore SEH. [...]

Voir également:

97
ollo

SJLJ (setjmp/longjmp): - disponible pour les versions 32 bits et 64 bits - non "à coût zéro": même si une exception n'est pas levée, elle entraîne une pénalité de performance mineure (~ 15 % dans le code d'exception lourd) - permet aux exceptions de traverser, par exemple rappels Windows

NAIN (DW2, nain-2) - disponible pour 32 bits uniquement - pas de temps d’exécution permanent - nécessite que toute la pile d’appels soit activée pour le nain, ce qui signifie que les exceptions ne peuvent pas être levées, par exemple. DLL système Windows.

SEH (zéro surdébit) - sera disponible pour GCC 4.8 bits 64 bits.

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

73
user2127352