Question

Par exemple, si j'ai un Enum avec deux cas, faut-il plus de mémoire qu'un booléen? Langages: Java, C ++

Était-ce utile?

La solution

En Java, un enum est une classe à part entière :

  

Types d'énumération du langage de programmation Java   sont beaucoup plus puissants que leur   contreparties dans d'autres langues. le   déclaration enum définit une classe   (appelé un type enum). La classe d'énum   corps peut inclure des méthodes et autres   champs.

Afin de voir la taille réelle de chaque class, réalisons une Constants réelle et examinons le contenu du fichier javap qu'il crée.

Disons que nous avons la new Constants(String) classe d'énumération suivante:

public enum Constants {
  ONE,
  TWO,
  THREE;
}

La compilation de ce qui précède <=> et le désassemblage du fichier <=> résultant avec <=> donne les éléments suivants:

Compiled from "Constants.java"
public final class Constants extends java.lang.Enum{
    public static final Constants ONE;
    public static final Constants TWO;
    public static final Constants THREE;
    public static Constants[] values();
    public static Constants valueOf(java.lang.String);
    static {};
}

Le désassemblage montre que chaque champ d'un <=> est une instance de la classe <=> <=>. (Une analyse plus poussée avec <=> révélera que chaque champ est initialisé en créant un nouvel objet en appelant le constructeur <=> dans le bloc d'initialisation statique.)

Par conséquent, nous pouvons dire que chaque <=> champ créé sera au moins autant que le temps système nécessaire à la création d'un objet dans la machine virtuelle.

Autres conseils

En Java, il ne devrait y avoir qu'une seule instance de chacune des valeurs de votre enum en mémoire. Une référence à l'énum ne nécessite alors que le stockage correspondant à cette référence. Vérifier la valeur d’une énumération est aussi efficace que toute autre comparaison de référence.

Vous ne vous inquiétez de cela que lorsque vous stockez de grandes quantités d’énums. Pour Java, vous pourrez peut-être utiliser un EnumSet dans certains cas. Il utilise un vecteur de bits en interne qui est très efficace en espace et rapide.

http: //java.sun. com / j2se / 1.5.0 / docs / api / java / util / EnumSet.html

bool peut être implémenté sous la forme d'un seul octet, mais généralement dans une structure, il serait entouré par d'autres éléments ayant des exigences d'alignement qui signifieraient que le booléen occuperait effectivement au moins autant d'espace qu'un int .

Les processeurs modernes chargent les données de la mémoire principale sous la forme d’une ligne de cache complète, soit 64 octets. La différence entre le chargement d’un octet à partir du cache N1 et le chargement de quatre octets est négligeable.

Si vous essayez d'optimiser les lignes de cache dans une application très performante, vous vous inquiétez peut-être de la taille de votre enum, mais généralement, je dirais qu'il est plus clair de définir un enum que d'utiliser un booléen.

En Java, cela prendrait plus de mémoire. En C ++, cela ne prend pas plus de mémoire que nécessaire pour une constante du même type (elle est évaluée au moment de la compilation et n'a aucune signification résiduelle au moment de l'exécution). En C ++, cela signifie que le type par défaut d’une énumération occupera le même espace qu’un int.

Dans ISO C ++, une énumération n'est pas obligée d'être plus grande que son plus grand énumérateur. En particulier, enum {TRUE, FALSE} peut avoir sizeof (1) même quand sizeof (bool) == sizeof (int). Il n'y a tout simplement aucune exigence. Certains compilateurs font que les enums ont la même taille qu'un int. C'est une fonctionnalité du compilateur, qui est autorisée car la norme n'impose qu'un minimum. D'autres compilateurs utilisent des extensions pour contrôler la taille d'un enum.

printf("%d", sizeof(enum));

En C ++, une énumération a généralement la même taille qu'un int. Cela dit, il n'est pas rare que les compilateurs fournissent un commutateur de ligne de commande permettant à la taille de l'énum d'être définie sur la plus petite taille correspondant à la plage de valeurs définie.

Non, une énumération a généralement la même taille qu'un int, identique à boolean.

Si votre enum n'a jamais que deux cas, utiliser un booléen serait peut-être une meilleure idée (taille de la mémoire, performances, utilisation / logique), encore plus en Java.
Si vous vous interrogez sur le coût de la mémoire, cela peut vouloir dire que vous prévoyez d’en utiliser beaucoup. En Java, vous pouvez utiliser la classe BitSet ou, à une plus petite échelle, dans les deux langues, vous pouvez manipuler des bits avec des opérations au niveau du bit.

sizeof (enum) dépend de ce que vous avez dans l’énum. J'essayais récemment de trouver la taille d'un ArrayList () avec des paramètres de constructeur par défaut et aucun objet stocké à l'intérieur (ce qui signifie que la capacité de stockage est de 10). Il s’est avéré que ArrayList n’est pas trop gros & Lt; 100 octets.

Ainsi, sizeof (enum) pour une énumération très simple devrait être inférieur à 10 octets. vous pouvez écrire un petit programme, lui donner une certaine quantité de mémoire, puis essayer d’allouer des énumérations. vous devriez être capable de le comprendre (c'est comme ça que j'ai découvert la mémoire de ArrayList)

BR,
~ A

En C / C ++, une énumération aura la même taille qu'un int.

Avec gcc, vous pouvez ajouter un attribut ((compacté)) à la définition de l’énum pour lui faire prendre le minimum de poids. Si la plus grande valeur de l'énum est & Lt; 256 ce sera un octet, deux octets si la plus grande valeur est & Lt; 65536, etc.

typedef enum {
    MY_ENUM0,
    MY_ENUM1,
    MY_ENUM2,
    MY_ENUM3,
    MY_ENUM4,
    MY_ENUM5
} __attribute__((packed)) myEnum_e;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top