pepsidrinker
Messages postés151Date d'inscriptionmardi 12 octobre 2004StatutMembreDernière intervention15 avril 2009
-
19 oct. 2006 à 15:42
verdy_p
Messages postés202Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention29 janvier 2019
-
18 févr. 2007 à 21:50
Salut tlm.
PROBLEME assez complexe.
voyez par vous meme :
le sizeof d'un bool = 1 N'eST-CE ^PAS? EXEMPLE : cout<<sizeof(bool), la console donnera 1.
maintenant, déclarer 2 boolean, et demander la différence de leur adresse ...exemple :
bool rien;
bool rien2;
cout<< &rien2 - &rien;
(ce code ne marche pas en passant il manque les STATIC_CAAST avant les adresse)
vous verez qu'en fait, un boolean occupe bien plus qu'un octet !!!
DITE MOI POURQUOI SVP!!!
Pepsidrinker
mad_love_disease
Messages postés64Date d'inscriptionlundi 20 octobre 2003StatutMembreDernière intervention 1 juillet 20103 19 oct. 2006 à 15:53
Tout à fait Joky,
C'est même peut problable que les deux adresses se suivent.
De +, il me semble que le type bool n'existe pas en C et C++. Il existe dans les conventions mais il me semble qu'au final c'est un int qui est allouer. A verifier.......
pepsidrinker
Messages postés151Date d'inscriptionmardi 12 octobre 2004StatutMembreDernière intervention15 avril 2009 19 oct. 2006 à 15:55
C'est sur que dans les programme, le compilateur peut vouloir ne pas faire suivre les variable(c'Est même assez commun), mais dans ce programme , aucune autre variable n'est déclarer, et donc,les addresse se suivent.
Pepsidrinker
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 19 oct. 2006 à 16:00
Je rejoins Joky: tu ne sais pas si 2 variables déclarées à la suite auront des adresses consécutives...
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
pepsidrinker
Messages postés151Date d'inscriptionmardi 12 octobre 2004StatutMembreDernière intervention15 avril 2009 19 oct. 2006 à 16:29
c'est parce qu'en fait, mon professeur affirme que le type booleen est plus grand que int...???
comme je suis convaincus que BOOL est plus petit que INT, jai passez bcp de temp a argumenter avec lui...
cs_max12
Messages postés1491Date d'inscriptiondimanche 19 novembre 2000StatutModérateurDernière intervention 7 juillet 2014 19 oct. 2006 à 17:03
Si ma mémoire est bonne
bool = 1 octet
BOOL = 4 octet //Définit dans Windows.h ils se sont amusé a redéfinir en majuscule certaine type, mais BOOL est un int (unsigned ?) en réalité selon cette définition.
int = 4 Octet
verdy_p
Messages postés202Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention29 janvier 2019 18 févr. 2007 à 20:13
attention: sizeof retourne la taille qui serait nécessaire pour allouer un tableau d'objets du type indiqué, mais pas la taille maximale que l'objet occupera.
Donc on peut avoir sizeof(bool)=1 qui indique qu'on peu allouer un tableau bool[64] avec un malloc(64), mais cela n'indique pas la taille totale prise effectivement par le tableau, ni la taille de l'objet une fois lu de ce tableau.
Quand on déclare une variable bool de façon isolée, il y a la plupart du temps 1 octet alloué, plus des octets de bourrage pour des questions d'alignement et de performance.
Des octets d'alignements peuvent aussi être ajoutés dans les structures (sizeof n'indique pas la taille ni la position des octets de bourrage).
Bref, rappelez-vous que sizeof ne fournit donc que la taille **minimale** prise par un objet.
Note: on peut avoir aussi sizeof(bool[8])=1 et non sizeof(bool[8])=8 bien que sizeof(bool)=1 (la taille minimale d'un tableau peut être inférieure au produit de la taille minimale de ses élements et du nombre des éléments):
typedef struct { bool[8] flags; } exemple_t;ici on peut avoir; sizeof(exemple_t) 1; sizeof(exemple_t.flags[0]) 1; sizeof(exemple_t.flags[1]) = 1; ...
La taille d'une struture peut être inférieure ou supérieure à la taille de ses membres!
Bref, méfiez-vous de sizeof(): ce n'est souvent pas la taille effective des objets, c'est juste un opérateur utile pour déterminer la taille à allouer dans les appels d'allocation mémoire; il ne faut pas composer les sizeof() en supposant qu'ils s'additionnent en fonction des objets d'une structure ou d'un tableau (c'est généralement faux).
La différence d'adresse entre deux variables statiques, mêmes déclarées dans le même module et consécutivement n'est pas garantie! Il peut y avoir une rupture de page entre les deux, ou le compilateur peut librement les déplacer pour combler les trous laissés par l'alignement d'une variable, par exemple entre c et d ci-dessus, où il peut recaser b0,b1 et b2 mais laisser b3 après d!
Le comportement peut aussi être différent dans une structure ou dans la pile:
dummy(bool b8, bool b9) {
struct {
bool b0,b1,b2,b3;
} x;
auto bool b4,b5,b6,b7;
..;
}
là il peut activer le compactage par défaut et ne laisser aucun octet libre entre les booléens b0 à b3 de la struture, alors qu'il pourrait laisser 1 ou 3 octets de bourrage avant ou après les booléens b4 à b7 en pile... mais laisser encore 3 ou 7 octets de bourrage entre les paramètres b8 et b9.
Autre cas possible:
dummy(bool b0,bool b1,bool b2,bool b3,bool b4,bool b5) {
...
}
les premiers paramètres b0 à b3 sont passés par des registres, les paramètres b4 et b5 sont empilés. En cas de besoin de registre, le corps de la fonction réserve des variables automatiques implicites pour cacher b0 à b3 (il le fera si on essaye d'accéder à leur adresse mémoire avec l'opérateur "&"), et dans ce cas les adresses des variables seront "mélangées" avec b4 et b5 empilés avant l'adresse de retour et avant les emplacements de b0 à b3 déterminé à l'exécution en fonction des expressions dans lesquelles ces dernières variables sont employées.
La déclaration de variables d'un type donné ne crée explicitement aucune liaison avec une autre variable même de type identique.
Le seul cas où un ordre est imposé par une déclaration est celui des membres d'une structure, où d'une classe en C++, mais même cette déclaration ne garantit pas l'absence d'octets de bourrage qui dépendent de la plateforme ou du compilateur utilisé, ou des options de compilation ou des éventuels "#pragma" (ou mots-clés déclarateurs spéciaux spéifiques du compilateur, du genre "__declspec(packed(1))") insérés dans le code pour contrôler le compilateur et sa façon de compacter ou ordonner les structures déclarées!