web-dev-qa-db-fra.com

Combien de mémoire prend les énumes?

Par exemple, si j'ai une énumération avec deux cas, cela fait-il prendre plus de mémoire qu'un booléen? Langues: Java, C++

47
Jelo

En Java, une enum est une classe pleine épouse :

Le langage de programmation Java Les types d'énumjet sont beaucoup plus puissants que leurs homologues dans d'autres langues. La déclaration Enum définit une classe (appelée type d'énum). L'organisme de classe ENUM peut inclure des méthodes et d'autres domaines.

Afin de voir la taille réelle de chaque enum, effectuez un enum et examinez le contenu du fichier class créé.

Disons que nous avons ce qui suit Constants _ Enum classe:

public enum Constants {
  ONE,
  TWO,
  THREE;
}

Compiler ce qui précède enum _ et désassemblage résultant class fichier avec javap donne ce qui suit:

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émontage montre que chaque champ d'un enum est une instance de la classe Constantsenum. (Une analyse plus poussée avec javap _ révélera que chaque champ est initialisé en créant un nouvel objet en appelant le constructeur new Constants(String) constructeur dans le bloc d'initialisation statique.)

Par conséquent, nous pouvons dire que chaque champ enum que nous créons sera au moins autant que la surcharge de la création d'un objet dans la JVM.

44
coobird

En Java, il ne devrait y avoir qu'un exemple de chacune des valeurs de votre énumé en mémoire. Une référence à l'énum, ​​ne nécessite que le stockage de cette référence. Vérification de la valeur d'un énumé est aussi efficace que toute autre comparaison de référence.

17
thenickdude

bool peut être mis en œuvre comme un octet unique, mais généralement dans une structure, il serait entouré 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 des données de la mémoire principale en tant que ligne de cache entière, 64 octets. La différence entre le chargement d'un octet de L1 cache 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 pourriez vous inquiéter de la taille de votre énumé, mais je dirais généralement qu'il est plus clair de définir une énumération que d'utiliser un booléen.

7
Mike Dimmick

En Java, cela prendrait plus de mémoire. En C++, il ne prendrait aucune mémoire que nécessaire pour une constante du même type (il est évalué à 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 pour un Enum occupera le même espace que l'INT.

4
Jeff Hubbard

Dans l'ISO C++, il n'y a aucune obligation pour qu'un Enum soit plus grand que son plus gros énumérateur requiert. En particulier, Enum {True, False} peut avoir la taille de (1) même lorsque Tailleof (BOOL) == taille de (int). Il n'y a tout simplement aucune exigence. Certains compilateurs rendent l'ENUMS de la même taille que l'INT. C'est une fonctionnalité de 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 énumé.

3
MSalters

En C++, un énumé est typiquement de la même taille qu'un int. Cela dit qu'il n'est pas rare que les compilateurs fournissent un interrupteur de ligne de commande permettent de définir la taille de l'énumération sur la taille la plus petite qui correspond à la plage de valeurs définie.

1
Andrew Edgecombe
printf("%d", sizeof(enum));
1
Patrick

tailleof (Enum) dépend de ce que vous avez dans l'énum. J'essayais récemment de trouver la taille d'une arraylist () avec des paramètres de constructeur par défaut et aucun objet stocké à l'intérieur (ce qui signifie que la capacité à stocker est 10). Il s'est avéré que l'arraylist n'est pas trop gros <100 octets.

Donc, la taille de (Enum) pour un énumé très simple devrait être inférieur à 10 octets. Vous pouvez écrire un petit programme, lui donner une certaine mémoire, puis essayez d'allouer des énums. Vous devriez être capable de le comprendre (c'est comme ça que j'ai découvert la mémoire de l'arraylist)

Fr,
[.____] ~ a

0
anjanb

Non, une énumoire est généralement la même taille que l'INT, identique à Boolean.

0
Cody Brocious

Si votre énum n'aura jamais seulement deux cas, en utilisant effectivement un booléen pourrait plutôt être une meilleure idée (taille de la mémoire, performance, utilisation/logique), encore plus en Java.
[.____] Si vous vous demandez des coûts de mémoire, cela pourrait impliquer que vous envisagez d'utiliser beaucoup d'entre eux. In Java Vous pouvez utiliser la classe Bitset ou à plus petite échelle, dans les deux langues, vous pouvez manipuler des bits avec des opérations bitwises.

0
PhiLho

En C/C++, une énorme taille sera la même taille que l'INT.

Avec GCC, vous pouvez ajouter Attribut ((Emballé)) à la définition Enum pour le faire prendre l'empreinte minimale. Si la valeur la plus importante de l'ENUM est <256, cela sera un octet, deux octets si la valeur la plus importante est <65536, etc.

typedef enum {
    MY_ENUM0,
    MY_ENUM1,
    MY_ENUM2,
    MY_ENUM3,
    MY_ENUM4,
    MY_ENUM5
} __attribute__((packed)) myEnum_e;
0
DGentry