IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Utilisation du noexcept specifier ?


Sujet :

Langage C++

  1. #1
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut Utilisation du noexcept specifier ?
    Bonjour à tous.

    Je développe une librairie C++ pour la physique (header only parce que c'est du code hautement templaté) et j'ai une petite question. Pour l'instant, je n'ai jamais utiliser de spécification d'exception dans la déclaration de mes fonctions. Lorsque qu'une fonction doit lancer une exception, je met juste le throw suivi de l'exception adéquate dans le corps de la fonction... et c'est tout.

    Mais j'ai réalisé sur cppreference.com (http://en.cppreference.com/w/) que pas mal de fonctions de la librairie standard étaient déclarées noexcept. Ma question est donc: dois-je ajouter le mot clé noexcept à toutes mes fonctions (vu l'étendu de mes sources, je sens que ça va être long) qui ne comportent ni de throw ni d'appel à des fonctions pouvant lancer une exception.

    Si je dois le faire, pourriez-vous m'expliquer exactement pourquoi et les avantages de ce mot-clé ? Y-aurait-il un tutorial qui explique les bonnes pratiques concernant son utilisation ?

    Merci beaucoup

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    N'utilise pas les spécifications d'exception. Car elles ne font pas ce que tu pourrais croire. La seule qui ait un quelconque intérêt, c'est "throw()" (qui a été dépréciée au profit de noexcept dans le C++11) : elle dit au compilateur qu'il est autorisé à opérer des optimisations.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Lorsque l'on spécifie throw() (qui est déprécié au profit de noexcept() ), on dit au compilateur que la dite fonction n'est pas sensée lancer d'exception ce qui lui permet de faire certaines optimisations.

    Le problème, c'est que si tu appelles une fonction qui risque de lancer une exception et que tu ne gères pas cette exception au plus tard dans ta fonction trow() / noexcept()

    En effet, la norme prévoit que, si ce cas de figure survient, l'application doit quitter irrémédiablement parce qu'il n'y a purement et simplement aucun moyen de savoir ce qu'il aurait fallu faire (en plus des optimisations que le compilateur risque d'avoir faites et qui risquent d'aller foutre le b...del).

    Bref, tu comprendras sans doute qu'il vaut vraiment mieux être tout à fait sur de son coup avant d'utiliser ce genre de spécificateur et le conseil de Luc : ne t'embête pas avec ca, à moins de savoir exactement ce que tu fais
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    La situation pour throw() n'est pas la même que pour noexcept.

    noexcept peut être testé à la compilation, afin d'effectuer des opérations différentes selon qu'une opération est déclarée noexcept ou pas.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut
    Bon, c'est du déterrage de topic, mais je pense que ça peut être utile pour certains d'entre vous. Sur des questions de performance pure, l'utilisation du noexcept peut être assez intéressante car le compilateur peut être autorisé à faire des optimisations plus agressives, cf ce talk de scott meyers: http://channel9.msdn.com/Events/Goin...p11-14-Sampler

Discussions similaires

  1. [Maven][Debutant]Specifier jar a utiliser
    Par royto dans le forum Maven
    Réponses: 1
    Dernier message: 06/07/2005, 10h46
  2. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo