Taille en mémoire d'un booléen - C++ - Programmation
Marsh Posté le 30-09-2004 à 21:06:42
Un bool occupe 1 octet en mémoire.
Marsh Posté le 30-09-2004 à 21:10:38
Seul vector<bool> tient compte d'une optimistion de sorte que chaque élement de type bool occupe un seul bit... module 8 au global.
Marsh Posté le 30-09-2004 à 21:34:34
ok mais si un bool occupe 1 octet en mémoire quece qui é codé sur les 8 bits ?
Marsh Posté le 30-09-2004 à 21:46:51
En fait je vient de trouver que cette taille dépendait du compilateur :
Citation : Même taille que le type int, parfois 1 sur quelques compilateurs |
Source CcM (comment ca marche.net)
Mais j'ai toujours pas compris pourquoi 1 ou 2 octets alors qu'un bit suffirai... si qqun sait..
Merci
Marsh Posté le 30-09-2004 à 21:49:51
Nad1 a écrit : |
parceque le processeur ne sait addresser que des mots, et que de toutes façons, zsi tu as benoi de moins, il aligne sur cette taille/
Marsh Posté le 30-09-2004 à 23:30:03
l'Itanium possède des registres booléens.
64 registres indépendants de 1 bits qui servent à la prédication.
stoqué en mémoire, c'est variable suivant le compilo.
dans le cas d'un calcul sans stoquage mémoire explicite, sur un itanium, 1 bool c'est un registre de prédication.
Marsh Posté le 01-10-2004 à 00:39:21
Nithril a écrit : sizeof(bool) |
voilà une réponse de censé. classiquement on a sizeof(bool) == sizeof(char).
maintenant, pourquoi est-ce qu'un bool fait minimum sizeof(char) ?
Marsh Posté le 01-10-2004 à 08:33:27
parce que par definition char designe la plus petite entité adessable ?
Marsh Posté le 01-10-2004 à 10:21:27
d'ailleur sizeof renvoi une taille en char et non en byte ?
Marsh Posté le 01-10-2004 à 10:37:48
si tu fais une structure avec 2 bool et 2 char, ta mémoire sera adressée différement selon l'ordre
bool
char
bool
char
prendre plus de place que
bool
bool
char
char
Marsh Posté le 01-10-2004 à 10:45:58
JagStang a écrit : si tu fais une structure avec 2 bool et 2 char, ta mémoire sera adressée différement selon l'ordre |
Aille, non, pas en pratique sur les machines que l'on a (windows ou unix), vu que char et bool sont généralement implémentés en 8 bits.
Tu devais penser à :
Code :
|
contre
Code :
|
Marsh Posté le 01-10-2004 à 14:21:28
Taz a écrit : ça dépend de ton compilateur et de ton architecture. |
Taz, c'est fini les machines qui addressent en 8 bits...
Marsh Posté le 01-10-2004 à 14:47:13
Je pense que dans beaucoup d'implémentation les types "bool" et "char" sont équivalents, sauf pour "unsigned bool" (fun !).
Il est évident qu'il est impossible pour les compilos d'allouer moins d'un octet pour stocker un bool. Imaginez ce que pourrait donner un pointeur (ou une référence) si ce n'était qu'un bit. Si vous voulez couper les cheveux (ou les octets) en quatre, employer les champs de bits dans les structures, ça existe depuis les toutes premières versions du C (struct { unsigned a:2, b:3, c:1, ...; }; )
La grande utilité de bool est de signaler explicitement à quoi va servir la variable.
Marsh Posté le 01-10-2004 à 15:10:13
Lam's a écrit : Aille, non, pas en pratique sur les machines que l'on a (windows ou unix), vu que char et bool sont généralement implémentés en 8 bits.
|
et pourtant. je l'ai testé l'an passé...
Marsh Posté le 01-10-2004 à 15:16:07
JagStang a écrit : et pourtant. je l'ai testé l'an passé... |
Attention, je te donne l'implémentation en mémoire de base. Après, les 2 exemples que je donnes vont tous les deux être alignés sur 8 octets.
Donc, si tu fais une structure et que tu en fais un sizeof, dans les 2 cas ça prendra 8 octets sur des machines 32 bits.
Sinon, il est possible que tu aies compilé en mode optimisé, et que le compilo aie décidé de tout aligner sur 32 bits (sauf les bool). Mais ça me parrait super louche : je n'ai jamais entendu parler d'une telle exception...
Marsh Posté le 01-10-2004 à 15:42:16
Lam's a écrit : Attention, je te donne l'implémentation en mémoire de base. Après, les 2 exemples que je donnes vont tous les deux être alignés sur 8 octets. |
De toute façon, supposer que les membres d'une structure sont alignés ainsi, c'est moisi. Avec le cc d'un solaris sparc par exemple, c'est niqué...
Marsh Posté le 01-10-2004 à 17:05:29
ReplyMarsh Posté le 01-10-2004 à 17:19:18
Taz a écrit : je vois pas le rapport. |
il dit qu'il voit pas le rapport
Marsh Posté le 06-10-2004 à 02:52:14
Taz a écrit : je vois pas le rapport. |
Je pense qu'il voulait dire: c'est fini les compilos qui alignent pas. Ce qui est faux. Ça reste une option les optimisations d'alignement 2, 4, 8, ... octets.
Marsh Posté le 07-10-2004 à 21:05:16
la vraie raison c'est surtout que créer un type bool sur 1 bit nécessitait que l'architecture du système ait prévu qu'on puisse coder des données sur 1 bit, or comme on le sait tous, une donnée prend au minimum 1 octet, on ne peut rien lire de moins grand, c'est dû au fonctionnement même des processeurs, et comme le logiciel vient après le matériel, ils ont adapté les langages au matériel. point.
ceci dit, rien ne t'empêche d'optimiser toi meme...
si t'as 8 bool ou moins, ça ne prend qu'un char mais si ton programme en manipule plus de 8, va falloir créer des tas de char, pas pratique.
indépendamment de ça faudra coder des fonctions qui utilisent des masques pour sortir la valeur du bit désiré, etc, etc...
c'est du vécu et au final ça coûte plus de temps CPU que de coller ton bool sur un octet.
Marsh Posté le 07-10-2004 à 21:07:48
non on le sait pas tous. y a des architectures ou la plus petite unité adressable fait 16bits ou 32bits. Donc ton explication tombe à l'eau. Si sizeof(bool) >= sizeof(char) c'est uniquement une contrainte du C qui dit que le char est la plus petite unité adressable et que sizeof(char) == 1 par définition.
Marsh Posté le 08-10-2004 à 09:26:10
Taz a écrit : non on le sait pas tous. y a des architectures ou la plus petite unité adressable fait 16bits ou 32bits. |
16 bits c'est plus grand que 8 bits, OK ? Donc, si certaines archi ne savent pas faire moins de 16 bits, c'est qu'elles ne savent pas faire moins de 8 bits, OK ? (tout comme par exemple, il est correct de dire qu'un dé à 6 faces ne peut donner plus de 12 valeurs).
Au fait, as tu des exemples de telles architectures (en terme d'addressage 16 bits, hein, pas juste une archi qui demande des pauvres accès mémoires alignés).
Marsh Posté le 08-10-2004 à 10:17:05
Lam's a écrit : 16 bits c'est plus grand que 8 bits, OK ? Donc, si certaines archi ne savent pas faire moins de 16 bits, c'est qu'elles ne savent pas faire moins de 8 bits, OK ? (tout comme par exemple, il est correct de dire qu'un dé à 6 faces ne peut donner plus de 12 valeurs). |
De toute façon, supposer qu'un bool fait 1 bit, 1 octet, 2 octets, 4 octets ou je ne sais quoi encore, c'est moisi. Un bool, ça fait sizeof(bool) et basta. Après, tout dépend de l'archi, de l'ABI utilisée et de la manière dont le compilo la respecte. Bref, sa prof aurait du répondre qu'il n'a pas à se préoccuper de la taille d'un bool à moins de très bien savoir ce qu'il veut faire (à savoir, écrire du code non-portable).
Marsh Posté le 08-10-2004 à 13:37:57
les DSP type C24 de TI sont avec sizeof(char) == 1 avec le char qui fait 16 bits.
Marsh Posté le 15-10-2004 à 19:27:28
on parle de l'architecture que tout le monde utilise, à savoir du x86, qu'est-ce que j'en ai à foutre de savoir que sizeof(bool) = l'age de ma grand mère dans les processeurs Gzoul47 dédiés aux ascenceurs au Pérou
Marsh Posté le 15-10-2004 à 19:57:34
l'eau de la a écrit : les DSP type C24 de TI sont avec sizeof(char) == 1 avec le char qui fait 16 bits. |
kR0M a écrit : on parle de l'architecture que tout le monde utilise, à savoir du x86, qu'est-ce que j'en ai à foutre de savoir que sizeof(bool) = l'age de ma grand mère dans les processeurs Gzoul47 dédiés aux ascenceurs au Pérou |
Marsh Posté le 30-09-2004 à 20:59:30
J'aimerai juste savoir la taille en mémoire d'un booléen ! La prof nous a dis deux octets ca m'étonne un peu sachant que seul deux solution son possible true or false j'aurai plutot pensé à 1 bit! non?
Merci