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

Je ne trouve pas assez d’informations pour décider quel compilateur dois-je utiliser pour comstackr 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 comstack rapidement et utilise moins de mémoire.

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

J’ai donc décidé d’utiliser MinGW. Mais vous ne trouvez aucune explication sur les méthodes de gestion des exceptions et leurs implémentations dans MinGW. Je peux utiliser différentes dissortingbutions 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.
  • OS: Microsoft Windows XP / 7/8 / Linux
  • Architecture: Intel Core i7 / Core2 / et un très vieux i686 sous XP: P

    Il y a un bref aperçu au wiki MinGW-w64 :

    Pourquoi mingw-w64 gcc ne prend-il pas en charge la gestion des exceptions Dwarf-2?

    L’implémentation Dwarf-2 EH pour Windows n’est pas du tout conçue pour fonctionner sous les applications Windows 64 bits. En mode win32, le gestionnaire de déroulement des exceptions ne peut pas se propager via un code non compatible avec dw2, cela signifie que toute exception traversant un code “étranger” non compatible avec dw2 échouera, y compris les DLL et les DLL système Windows construites avec Visual Studio. Le code de déroulement Dwarf-2 dans gcc inspecte l’assemblage de déroulement x86 et ne peut pas continuer sans les autres informations de décompression naines.

    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 gestion des exceptions dans gcc est en cours de développement pour surmonter les faiblesses de dw2 et de sjlj. Sur win64, les informations de déroulement sont placées dans xdata-section et il y a la .pdata (table de descripteurs de fonctions) à la place de la stack. Pour win32, la chaîne de gestionnaires est sur la stack et doit être sauvegardée / restaurée par du vrai code exécuté.

    GCC GNU sur la 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 un léger gonflement des exécutables car les tables de déroulement de la stack 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 une exécution normale quand aucune exception n’est levée), mais peut fonctionner sur du code qui n’a pas été compilé avec GCC ou qui n’a pas d’informations de déroulement d’appel.

    […]

    Gestion des exceptions structurées (SEH)

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

    Voir également:

    • Modèles de gestion des exceptions de GCC
    • Gestion des exceptions C ++ pour IA-64
    • EH débutants howto

    SJLJ (setjmp / longjmp): – disponible pour 32 bits et 64 bits – pas «zéro coût»: même si une exception n’est pas levée, une pénalité de performance mineure (environ 15% en code lourd d’exception) est tolérée – permet des exceptions parcourir par exemple des rappels de fenêtres

    DWARF (DW2, dwarf-2) – disponible uniquement pour 32 bits – pas de surcharge d’exécution permanente – nécessite que la stack d’appels soit entièrement compatible, ce qui signifie que les exceptions ne peuvent pas être lancées sur des DLL système Windows.

    SEH (exception zéro surcharge) – sera disponible pour GCC 4.8 à 64 bits.

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