Taille mémoire des énumérations

Taille mémoire des énumérations - C++ - Programmation

Marsh Posté le 31-10-2004 à 13:01:12    

Je suis très étonné de constater qu'une énumération du type :  
"enum ColorStyle { RGB=3, RGBA };"
me squatte 4octets par instanciation de variables de type ColorStyle ; ce qui est simplement gigantesque (cf : sizeof(ColorStyle)).  
Je me demande si il n'y a pas quelque chose qui m'échappe par ce qu'on m'a souvent venté les mérites des énumérations mais dans ce cas c’est inutilisable ; je préfère très clairement utiliser un bool et un #define ça me prendra 4fois moins de place??
 
Est-il possible réduire la place mémoire d'un type énuméré en fonction du rang de valeurs utilisé?


---------------
"Theres 10 types of people in the world : Those who understand binary and those who don't."
Reply

Marsh Posté le 31-10-2004 à 13:01:12   

Reply

Marsh Posté le 31-10-2004 à 13:22:58    

un enumerateur c'est une constante de type int
 
sizeof(ColorStyle) == sizeof(int)

Reply

Marsh Posté le 31-10-2004 à 13:34:30    

Je pensai que c'était un peu plus suptile que ça!
 
tanpis; merci quand même :)


---------------
"Theres 10 types of people in the world : Those who understand binary and those who don't."
Reply

Marsh Posté le 31-10-2004 à 22:30:24    

cris56 a écrit :

un enumerateur c'est une constante de type int
 
sizeof(ColorStyle) == sizeof(int)

non. le type sous-jacent est laissé à l'appréciation du compilateur.

Reply

Marsh Posté le 31-10-2004 à 22:35:22    

Je crois même que le compilo n'est pas forcé d'utiliser la même taille pour toutes les énumérations (à moins que je confonde avec les bitfields...)

Reply

Marsh Posté le 31-10-2004 à 23:24:48    

je vois rien qui empêche cela, une enum étant convertible avec le mécanisme de promotion entière traditionnel

Reply

Marsh Posté le 01-11-2004 à 08:38:58    

peak a écrit :


Est-il possible réduire la place mémoire d'un type énuméré en fonction du rang de valeurs utilisé?


 
Si tu les stockes de manière individuelles, tu as tout de meme de grande chance pour que le compilo les stockes par blocs facilement décodables par ton processeur donc par blocs de quatre octets au moins.
 
Tu as plus de chance de gagner de la place en stockant plusieurs variables ensembles. Comme quelqu'un l'a dit avec des bitfields, ou en utilisant des énums "ORées" ensemble.
 
LeGreg

Reply

Marsh Posté le 01-11-2004 à 21:37:50    

Taz a écrit :

je vois rien qui empêche cela, une enum étant convertible avec le mécanisme de promotion entière traditionnel


Ok, je préfère ça; je me disait bien que ce n'était pas possible ; qu'il avait du y penser ... ceci dis l'idée de les combinés à plusieurs (si c'est bien ce que "...ou en utilisant des énums "ORées" ensemble.." signifait  :ange: ) ne m'enchante pas non plus étant donné que la raison de l'utilisation d'enum dans mon code est l'amélioration de sa lisibilité.  
Disons que c'est très pratique mais pas à ce coût là et que bon si je ne suis pas sur de ce qu'en fait mon compilo ça m'avance pas vraiment.
 
Pour l'instant j'utilise un char et un define ce qui ne me prend que 1octet par variable, bon évidement en soit c'est pas grand chose mais quand c'est une variable membre d'un objet instancier une centaine de millier de fois c'est tout de suite moins sympas de perde 1/2Mo...
Si je n'ai pas un moyen pour lequel je suis sûr de payer le même prix que mon char je me résignerai à ne pas utiliser d'enum par contre si vous avez une solution je demande pas mieux.
 
Merci à tous pour vos réponses. :jap:


Message édité par peak le 01-11-2004 à 21:42:20
Reply

Marsh Posté le 01-11-2004 à 23:00:57    

Tu peux stocker tes variables sous une forme et les lire sous une autre.
 
De plus tu n'es jamais obligé d'utiliser des #define pour définir des constantes numériques entières positives.
 
Et enfin tu peux stocker des valeurs au bit près si tu groupes tes déclarations ensembles (bitfields). Et cela sans limiter la lisibilité.

Reply

Marsh Posté le 02-11-2004 à 01:26:28    

En effet ça devrait faire l'affaire, je connaissait pas cette technique.
 
Désolé, suis parfois un peu dur d'oreille.
 
Merci.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed