2
votes

Quelqu'un peut-il expliquer schématiquement comment l'énumération est stockée en mémoire?

Comment le type de données Enumeration est-il stocké en mémoire? Enum est-il vraiment stocké en mémoire dans la pile? Comment chaque valeur d'énumération est-elle accédée?

J'ai parcouru de nombreux blogs indiquant que les enum ne sont pas stockés dans la pile. Ils n'ont pas besoin de mémoire pour stocker?


6 commentaires

Exactement comme un int. Aucune différence.


si nous avons enum Name: [type = int] {*} et Name x - si recuire exactement la taille comme type , par défaut comme < code> int , et peut être stocké n'importe où en fonction de l'endroit où Name x est décalé. s'il est déclaré comme variable locale - sera stocké dans la pile


est-ce vrai pour la plateforme .Net ..


Oui c'est vrai.


L'énumération est-elle stockée sous forme de bloc dans la pile ou séparément en tant qu'entités individuelles.Si celles-ci sont stockées individuellement, comment y accéder?


De la même manière, les structures sont-elles stockées dans la pile sous forme de blocs où la variable struct pointe vers le bloc ou y a-t-il une autre façon de les stocker?


3 Réponses :


1
votes

Une énumération est une interprétation d'un type de données numérique déduit par le compilateur (généralement un entier, mais vous pouvez le changer).

Le compilateur introduit un nouveau type pour chaque énumération que vous définissez. Le type nouvellement défini est particulier, car vous ne pouvez pas hériter de, et contient des opérateurs que vous pouvez utiliser pour le transtyper et un type intégral.

Du point de vue de la mémoire, l'énumération est stockée dans une valeur d'intégrale type capable de contenir toutes les valeurs que vous avez déclarées.

Le CLR fournit ceci comme service de base, donc les langages comme c # ont ce comportement. Ce n'est peut-être pas la règle pour tout le monde. Langage supporté par Net.

Comme les types enum sont traités comme des types intégraux, ils sont stockés dans la pile et s'inscrivent comme leurs types de données respectifs: une enum standard est généralement implémentée comme un int32; cela signifie que le compilateur gérera votre enum comme synonyme de int32 (par souci de simplicité, j'ai omis plusieurs détails). Par conséquent, votre enum est à la fin un int32.

Si vous voulez contrôler la façon dont une énumération est implémentée, vous pouvez la déclarer de cette façon:

enum MyEnum: byte{}

Dans l'exemple ci-dessus, MyEnum est un octet, par conséquent, le compilateur le gérera comme un octet.


7 commentaires

comment enum est stocké dans la pile?


J'ai modifié la réponse pour inclure ce que vous voyez. S'il vous plaît, faites-moi savoir si vous avez besoin de plus.


L'énumération est-elle stockée sous forme de bloc dans la pile ou séparément en tant qu'entités individuelles.Si celles-ci sont stockées individuellement, comment y accéder?


Les valeurs qu'une énumération peut prendre, disons A, B et C, sont transformées en entiers tels que 0, 1 et 2. L'énumération elle-même est en effet un entier. Les nombres entiers sont placés dans la pile sous la forme de 4 octets, alignés comme requis par la plate-forme. Aucune entité n'est stockée, car seule la valeur est stockée. Si vous utilisez des champs de bits, les champs de bits autorisent 32 ou 64 valeurs maximum, et chaque valeur est transformée en une puissance de 2


Votre explication m'est très utile.Merci !!


De la même manière, les structures sont-elles stockées dans la pile sous forme de blocs où la variable struct pointe vers le bloc ou existe-t-il une autre façon de les stocker?


Les structures sont stockées séquentiellement, un champ après l'autre. Les champs doivent être alignés sur les limites de la plateforme pour un accès optimal. Le compilateur c # réorganise tous les membres comme il convient de l'optimiser. Vous pouvez contrôler la façon dont les champs sont stockés dans les structures avec les attributs appropriés. Une énumération n'est qu'une valeur unique, c'est un entier. Les métadonnées sont stockées dans les structures de données du compilateur.



0
votes

les énumérations ne sont pas allouées en mémoire - elles n'existent qu'au stade de la compilation. Ils n'existent que pour dire au compilateur quelle est la valeur Tuesday dans votre exemple. Quand le code s'exécute - il n'y a plus d'énumérations là-bas.

Cela fait la même chose que ci-dessous

#define Monday 0;
#define Tuesday 1;
.
.
.
.
#define Sunday 6;

Mais nous préférons les énumérations à définir car plus facile à supporter et lire le code avec enums puis avec #defines.

Vous pouvez obtenir la clarté de la taille de l'énumération en suivant Réponse Stackoverflow


0 commentaires

1
votes

Les énumérations sont des constantes stockées.
Une fois qu'une liste de valeurs est créée pour une énumération, ces valeurs sont stockées sous forme de littéraux par rapport à leur nom d'affichage (nom d'accès donné au moment de la déclaration d'énumération). La réponse de Pier est appropriée pour le stockage. Vérifiez l'outil ILDASM pour extraire les littéraux d'énumération dans le code IL.  Ceci est un exemple de code IL pour une énumération


0 commentaires