L'utilisation de anonyme enums
Quel est le but de l'anonymat de la enum
des déclarations telles que:
enum { color = 1 };
Pourquoi ne pas simplement déclarer int color = 1
?
- Vous pourriez, mais qui permet d'économiser de la mémoire.
- de quelle manière pouvez enregistrer menory?
- Voir ma réponse ci-dessous.
- Posté une réponse.
- mais où la valeur de la couleur=1? pas de mémoire? mais où est la couleur et sa valeur de 1 gardé?
- Le compilateur peut le graver dans la CPU instructions, comme
foo = color;
-->mov 1, foo
- Le compilateur remplace simplement
color
avec1
. Tout comme le numéro 42 de ne pas prendre de mémoire dans votre programme les énumérations ne sont pas non plus. BTW putain vous pour me faire écorcher couleur 🙂 - non non, haha, le nom de la variable est la couleur!
- Et d'où vient cette
1
dansmov 1, foo
vivre si ce n'est dans la mémoire? Hein? Maintenant, il n'est pas dans un seul endroit (int
variable), mais à chaque endroit où il est utilisé (intégré dans ces instructions).
Vous devez vous connecter pour publier un commentaire.
Les énumérations ne prennent pas de place et sont immuables.
Si vous avez utilisé
const int color = 1;
alors vous permettrait de résoudre la mutabilité de la question, mais si quelqu'un a eu l'adresse decolor
(const int* p = &color;
) puis de l'espace devrait être affecté. Cela peut ne pas être une grosse affaire, mais, sauf si vous explicitement voulez les gens à être en mesure de prendre l'adresse decolor
vous pourriez aussi bien l'en empêcher.Également lors de la déclaration d'un champ constant dans une classe alors il va falloir être
static const
(pas vrai pour modern C++) et pas tous les compilateurs support inline initialisation static const membres.Avertissement: Cette réponse ne doit pas être pris comme des conseils pour utiliser
enum
pour tous les constantes numériques. Vous devez faire ce que vous (ou vos collègues) pense que c'est plus lisible. La réponse juste quelques listes de raisons pour un pourrait préfèrent utiliser unenum
.const int
est immuable, et ne peut pas prendre de place, en fonction de ce que le compilateur choisit de le faire.enum
au moment de l'exécution!enum { answer = 42 };
et de les utiliser plus tardanswer
le compilateur utilise la constante42
et il n'y a pas de variable dans la vue.C'est un soi-disant enum truc pour déclarer au moment de la compilation constante entière. C'est l'avantage est qu'il garantit qu'aucune variable est instanciée et, par conséquent, il n'y a pas de gestion d'exécution. La plupart des compilateurs introduire aucune surcharge avec des constantes entières de toute façon.
enum
en place d'unconst int
en dehors de cela.Si c'est de l'ancien code, puis d'enum pourrait avoir été utilisé pour la "enum hack".
Vous pouvez en apprendre plus sur le "enum hack", par exemple, dans ce lien: enum hack
L'un de l'utilisation de ce est quand vous faites le modèle de la métaprogrammation, car enum objets ne sont pas lvalues, tandis que
static const
membres. Il est également utilisé pour être une solution de contournement commune pour les compilateurs qui ne l'a pas laissé l'initialisation statique intégrale des constantes dans la définition de classe. Ceci est expliqué dans une autre question.constexpr
.color
est variable (accidentellement).color
ne peut pas être modifié.L'autre option pour
enum
est,Les deux
enum
etconst int
offre exactement le même concept; c'est une question de choix. En ce qui concerne la croyance populaire queenum
s économiser de l'espace, de l'OMI, il n'y a pas de contrainte de mémoire par rapport à cela, le compilateur sont assez intelligents pour optimiserconst int
en cas de besoin.[Note: Si quelqu'un essaie d'utiliser
const_cast<>
sur unconst int
; il en résulte un comportement indéfini (ce qui est mauvais). Cependant, le même n'est pas possible pourenum
. Donc, mon favori personnel estenum
]const int
doit être privilégiée, car la sémantique correspondre plus étroitement à l'intention (ce n'est pas une énumération!).const int color = 1;
, la couleur pourrait encore être modifiée si tu le voulais vraiment, avecconst_cast
; enum, cependant, ne peut pas être changé.const_cast
la constness loin: c'est un comportement indéterminé.enum
surconst int
; OMI ils sont plus organisés et probablement pas obtenir agressées parconst_cast
et suite à UB.const int
pourrait être mutables.const
rendements comportement indéfini. La norme encourage à mettreconst
-déclarée des choses dans la ROM..rodata
, oui? (Je suppose que.text
est possible, c'est en lecture seule, je crois, mais est-ce déjà fait? Peut-être quand un.rodata
n'existe pas et ils préfèrent utiliser.text
que.data
c'est donc en lecture seule?)Lorsque vous utilisez
enum {color = 1}
vous n'êtes pas à l'aide de la mémoire c'est comme
#define color 1
Si vous déclarez une variable
int color=1
Alors vous avez de la mémoire pour une valeur qui n'a pas à être changé.
const int x=1; const int* y=&x; cout << y;
. Rien n'est écrit dans x après la déclaration. Vous pourriez veux voir le résultat de ce.Je ne la voyez pas mentionné, une autre utilisation est à la portée de votre constantes. Je travaille actuellement sur le code qui a été écrit à l'aide de Visual Studio 2005, et il est maintenant porté à android - g++. Dans VS2005 vous pourriez avoir un code comme ceci
enum MyOpts { OPT1 = 1 };
et l'utiliser comme MyOpts::OPT1 - et le compilateur n'a pas à s'en plaindre, même si elle n'est pas valide. g++ rapports de code d'erreur, si une solution est d'utiliser anonyme enum comme suit:struct MyOpts { enum {OPT1 =1}; };
, et maintenant les deux compilateurs sont heureux.