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++
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 Constants
enum
. (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.
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.
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.
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.
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é.
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.
printf("%d", sizeof(enum));
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
Non, une énumoire est généralement la même taille que l'INT, identique à Boolean.
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.
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;