MSVC /EHsc vs /EHa (synchrone vs asynchrone gestion des exceptions)
Pourrait vous donner une liste à puce de différences pratiques/implication? J'ai lu pertinents de l'article MSDN, mais ma compréhension asynchrone exceptions est encore un peu floue.
Je suis en train d'écrire une suite de tests à l'aide de coup de pouce.Test et mon compilateur émet un avertissement que l'Ire doit être activé:
avertissement C4535: appel _set_se_translator() exige /EHa
Le projet lui-même utilise seulement les simples exceptions de la STL) et n'a pas besoin d' /EHa commutateur. Dois-je recompiler avec /EHa interrupteur pour faire de la suite de test fonctionne correctement? Mon sentiment est que j'ai besoin de /Ire pour la fonction de test uniquement.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous utilisez /EHsc, le compilateur n'émettent code pour les filtres d'exception quand il peut détecter que le code enveloppé dans le try {} bloc pourrait jeter une des exceptions C++. Une exception filtre garantit que le destructeur de tout les objets C++ appelée lorsque la pile est déroulée lors de la manipulation d'exception. Il fait RAII de travail.
C'est de l'optimisation, l'espace et le temps pour x86 code, de l'espace pour de code x64. De l'espace, car il peut omettre l'exception du filtre de code, qui est modeste, btw. Le temps parce que sur x86 il permet d'éviter l'enregistrement de l'exception de filtre à l'entrée de la try {} bloc. Très modeste, btw. x64 utilise un autre moyen de trouver des filtres d'exception, elle est basée sur la table.
La phrase clé dans le premier paragraphe est "pourraient jeter l'une des exceptions C++". Sur Windows il existe d'autres sources d'exceptions. Comme le "a" dans /EHa, asynchrone exceptions soulevées par le matériel. Des choses comme des exceptions de virgule flottante, la division par zéro, et le tout-puissant exception de violation d'accès. Mais aussi notamment la nature des exceptions soulevées par le code de ce que vous pourriez l'interopérabilité avec les. Comme le code managé, fondamentalement quelque chose qui s'exécute dans une machine virtuelle.
Quand vous voulez faire de vos objets en sécurité pour ce genre d'exceptions, alors vous aurez besoin d'utiliser /EHa, qui indique au compilateur de toujours enregistrer le filtre d'exception.
Méfiez-vous d'un côté méchant-effet de l' /EHa, il fait des captures(...) avaler tous exceptions. Y compris ceux que vous ne devriez jamais attraper, comme AV et AINSI de. Regardez
__try/__except
et _set_se_translator() si c'est important pour vous.Bien, sans /EHa vous ne pouvez pas attraper les exceptions inattendues de sorte que votre programme de test de la sortie anormalement.
Si le test peut être fait pour des sortie, il serait préférable de ne pas débattre avec /EHa.
En outre, la modification de l'option de /encourir l'Ire de nombreux effets secondaires, y compris augmentation de la taille de l'exécutable et peu de chute des performances. Donc, effectivement les changements de comportement d'origine.
Utiliser ou ne pas utiliser /EHa est une grosse décision, généralement prises au programme de l'étape de conception.
À mon humble avis, les problèmes au cas de test d'écriture sont plutôt insignifiants, de modifier cette décision.