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 :

enum et static const


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut enum et static const
    Hello,

    Il y a une légende urbaine qui dit que pou définir une constante entière statique, il vaut mieux utiliser un enum, car ça ne prend pas de mémoire, contrairement au static const.

    C'est encore d'actualité, cette différence ? Les compilateurs n'optimisent-ils pas ces static const ?

  2. #2
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Salut,

    Il semble que tu ne trouves ça que dans du vieux code, et ça s'appelle le "enum hack" . Regardes le chapitre 8.4.2 Constantes de compilation dans les classes du livre dispo sur ce site "Penser en C++" : le paragraphe "Le “enum hack” dans le vieux code"

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Cela est différent, bien que lié. Cette astuce concerne l'initialisation de données membre.

    Je vois une telle utilisation dans du code récent, au prétexte que ça économise de la mémoire...

  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 : 50
    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
    Par défaut
    Je n'en sais rien, vu que les internes d'un compilateur, à moins d'avoir développé avec... Je sais que si on prend l'adresse d'une telle constante, alors forcément elle doit être en mémoire quelque part. Est-ce que les compilateurs vérifient si une adresses est prise un jour ou pas, je n'en sais rien. Je pense que c'est possible (ça me semble semblable à ce que fait un compilateur avec une fonction inlinée), mais est-ce un enjeu en règle général ?

    Tu as tant de constantes que ça que ça ait un rôle mesurable dans ton programme ?

    Il faudrait aussi se poser la question de ce que font les compilateurs avec constexpr.
    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 éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Ben si ça ne dépendait que de moi, je mettrais des static const.

    C'est mon chef de projet qui insiste pour mettre des enum. Moi, ça me chagrine.

  6. #6
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Euh, je tente ma chance une dernière fois, promis!

    Il semble que ces deux méthodes puissent avoir des utilités légèrement différentes ( dixit Koala01 ) : [Metaprog] static const vs enum

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Fil très intéressant. Merci !

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 634
    Par défaut
    Salut,

    Ceci dit, j'ai trouvé une autre raison pour préférer les valeurs énumérées aux static const...

    Bon, on pourra toujours me dire que le problème est marginal, mais quand même:

    A priori, les valeurs énumérées prennent place dans la section donnée de l'application, et n'apparaissent donc qu'une seule fois dans l'exécutable final.

    Par contre, les variables statiques sont limitées à l'unité de compilation dans laquelle elles sont déclarées / définies.

    Si nous arrivons à ne pas inclure le fichier d'en-tête ailleurs que dans un fichier d'implémentation ( *.cpp), et que nous devons utiliser un certain nombre de fois notre classe avec une même valeur dans ces différents fichiers d'implémentation, il me semble que nous nous retrouverions avec... autant de variables, limitées à l'unité de compilation qu'il n'y a de fichiers d'implémentations dans laquelle elle sera utilisée.

    Comme je l'ai dit plus haut, le problème reste marginal dans le sens où nous aurions, au pire quelque dizaines de variables de type int (mettons), propres à chaque unité de compilation. Il en faudrait donc beaucoup pour arriver à une différence significative en terme de taille de l'exécutable.

    Mais le problème peut malgré tout se poser
    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

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Je remets une pièce dans le nourrain :

    http://www.augias.org/paercebal/tech...ependancy.html

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Juste une nuance, cela ne s'applique pas pour la méta-prog. Et là, je ne suis pas sur que le compilateur puisse substituer la valeur effective plutôt que d'utiliser une variable dans l'exécutable/bibliothèque cible.

Discussions similaires

  1. [Metaprog] static const vs enum
    Par Goten dans le forum Langage
    Réponses: 24
    Dernier message: 05/10/2009, 15h04
  2. enum imbriqués : static ou pas?
    Par ®om dans le forum Langage
    Réponses: 2
    Dernier message: 10/12/2006, 19h28
  3. Réponses: 2
    Dernier message: 30/10/2006, 16h40
  4. Réponses: 1
    Dernier message: 23/09/2006, 00h41
  5. static const et taille de tableau
    Par tut dans le forum C++
    Réponses: 3
    Dernier message: 27/01/2005, 16h01

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