Quelle est la différence entre sjlj vs nain vs seh?

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

je fais mon propre benchmark avec les compilateurs MSVC et GCC. Plus tard, on produit des binaires légèrement plus rapides (pour chaque sous-architecture). Bien que le temps de compilation soit beaucoup plus que MSVC.

donc J'ai décidé D'utiliser MinGW. Mais je ne trouve aucune explication sur les méthodes de gestion des exceptions et leurs implémentations en 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 usage. 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.
  • OS: Microsoft Windows XP / 7 / 8 / Linux
  • Architecture: Intel Core i7 / Core2 / et un très ancien i686 tournant sous XP: P
121
demandé sur Melebius 2013-03-28 01:48:15

2 réponses

il y a un bref aperçu à MinGW-w64 Wiki :

pourquoi mingw-w64 gcc ne supporte-t-il pas la gestion des exceptions Nain-2?

le Nain-2 EH l'implémentation Pour Windows n'est pas du tout conçu pour travailler sous des applications Windows 64 bits. En mode win32, l'exception le gestionnaire de décompression ne peut pas se propager à travers le code conscient Non-dw2, ce qui signifie que tout exception passant par tout non-dw2 conscient "cadres étrangers" code échouera, y compris Windows system DLLs et DLLs construit avec Visual Studio. Code de déverrouillage nain-2 dans gcc inspecte le x86 déroulement de l'assemblée et est incapable de continuer sans autre nain-2 décompresser l'information.

Le SetJump LongJump méthode de gestion des exceptions fonctionne pour la plupart des cas sur win32 et win64, à l'exception des défauts de protection générale. Structured exception le soutien à la manipulation dans le gcc est en cours de développement pour surmonter les faiblesses de dw2 et sjlj. Sur win64, le unwind-informations sont placés dans xdata-section et il ya le .pdata (table des descripteurs de fonction) au lieu de la pile. Pour win32, la chaîne des gestionnaires sont sur la pile et ont besoin d'être sauvés / restaurés par réel le code exécuté.

GCC GNU à propos de gestion des exceptions :

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

  • nain-2 (DW2) EH , qui nécessite l'utilisation de L'information de débogage nain-2 (ou nain-3). DW-2 EH peut causer des exécutables à être légèrement gonflée parce que les grandes tables de déroulement de pile d'appel doivent être inclus dans e exécutables.
  • Une méthode fondée sur la setjmp/longjmp (SJLJ) . L'EH basé sur le SJLJ est beaucoup plus lent que le DW2 EH (pénaliser même l'exécution normale quand aucun les exceptions sont jetées), mais peut fonctionner à travers le code qui n'a pas été compilé avec GCC ou qui n'a pas de dérouleur de pile d'appels information.

[...]

Structured Exception Handling (SEH)

Windows utilise son propre mécanisme de traitement D'exception connu sous le nom de traitement D'Exception structuré (Seh). [...] Malheureusement, GCC ne soutient pas encore SEH. [...]

voir aussi:

85
répondu ollo 2018-01-24 13:18:30

SJLJ (setjmp / longjmp): pénalité de rendement (~15% dans le code d'exception lourd) - permet des exceptions pour traverser par exemple les callbacks de windows

nain (DW2, nain-2) - disponible pour 32 bits seulement – pas de durée d'exécution permanente au-dessus – a besoin d'une pile d'appels entière pour être activée par nain, qui signifie que les exceptions ne peuvent pas être jetées par-dessus, par exemple Windows system DLLs.

SEH (exception sans frais généraux) – sera disponible pour 64 bits GCC 4.8.

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

67
répondu 2013-03-27 22:02:25