CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] Une petite question...

dnob700
dnob700
Niveau 10
05 avril 2006 à 16:35:10

un bool ne fait quand même qu´un seul octet en mémoire (pas dans les registres, j´y reviens) quelle que soit la machine utilisé (enfin entre un x86 ou du IA64 ou affilié, le reste, je ne connais pas).

un "bool tableau[N];" n´est pas pire qu´un "char tableau[N]".

De plus, quand on le charge en mémoire, on peut (en tout cas sur des machines 32 bits) manipuler des morceaux de registre par paquets de 8 bits (AH,AL,BH,...) donc la encore dire qu´on manipule un int est faux, sans compter qu´il est tout à fait possible qu´un bon compilo puisse effectuer directement avec l´architecture du processeur (sans passer par des extensions) la même opération sur plusieurs bool (jusqu´à 4 donc sur une machine 32 bits) d´un coup (en chargeant 4 éléments d´un tableau de bool dans un registre par exemple).

Et enfin, il pourrait exister (et il existe peut-être) des architectures comme le MIX de Knuth qui peuvent manipuler les bit un à un (or le C++ est cencé est "portable", donc il faut écrire des programme aussi pour ces archi...).

La moralité de tout ça, c´est que d´après moi il faut utiliser les types disponible : en C un programmeur c´est qu´un booléen est codé dans un int (et encore, autant utiliser des typedef int BOOL), mais en C++, rien que pour la lisibilité il est plus logique d´utiliser des bool il me semble.

-pedrolan-
-pedrolan-
Niveau 7
05 avril 2006 à 17:43:16

Ca me gêne beaucoup ça que les ´bool´ soient une exclusivité C++, car je les utilise pas mal pour les retours de mes fonctions...
Enfin bref sinon getchar() ça prend les touches jusqu´à Entrée, non?
Parce que ce qui est bien avec getch(), c´est que ca enregistre la première touche, pas jusqu´à Entrée.
Mais ça marche en C et pas en C++? :question:

JeanYvesYves
JeanYvesYves
Niveau 10
05 avril 2006 à 18:42:25

si ça te gene, tu peux définir, en C :

typedef bool char;

  1. define true 1
  2. define false 0

et la tu as défini ce que tu veux :)

Je tiens a signaler l´existance, dans les STL (étendues) (sinon je l´ai reprogrammé) un conteneur qui s´appelle :

bit_vector

Tres simple : vous dites combien de bits vous voulez allouer, et les manipulez avec les []
8 fois + compact d´un tableau de char utilisé en tant que booleens :) (sauf le petit header, qui est composée d´un ou 2 pointeurs...)

godrik
godrik
Niveau 30
05 avril 2006 à 18:53:31

Je ne sais pas trop quoi penser de ce que dit dnob.
quel serait l´adresse de tableau[1] sur une telle architecture ?

Je dis ca parceque je me suis demandé recement quel serait le résultat de:

struct bit
{
int a:1;
};

union{
char toto;
bit tab[8];
};

a priori pour pouvoir donner une adresse a chaque bit[i], il va les aligner sur un octet ?

dnob700
dnob700
Niveau 10
05 avril 2006 à 19:48:21

dans le dernier cas, il aligne sur un octet, ou peut-être même sur 4. Je ne sais pas comment c´est géré mais il y a le risque qu´il manipule un int:1 comme un int. Et dans ce cas là, il faut qu´il soit aligné (pour le processeur) sur 4 octets, donc si ça se trouve, le int a:1 fait aussi 4 octets.

Pour l´archi hypothétique dont je parlais, le fait qu´on puisse adresser des bit ne veut pas dire qu´un compilo C le ferait obligatoirement. Mais pour autant, je ne sais pas si la norme impose quoi que ce soit sur les pointeur. On pourrait très bien imaginer que les pointeurs fasse 3 octets : 2 octets pour adresser les mots (le MIX n´a que 16 kilo-mot de mémoire) et un dernier pour acceder le bit en question.

En l´occurence, ce que je dit est un peu une hérésie, car il n´est dit nulle part que le MIX soit une machine binaire. Mais ça n´empêche pas d´imaginer une machine où chaque bit de mémoire est adressable et d´avoir des pointeur en deux partie.

P.S. il y a aussi les bitset (qui sont des templates sur le nombre de bits voulu) à la place des bit_vector (qui sont probablement plus lent s´il s´agit de vecteur, mais je ne connais pas).

kufa
kufa
Niveau 9
06 avril 2006 à 03:38:17

Sans rentrer dans les details trop techniques (si vous voulez pas que je vous fasse du gros copier-coller de la norme :d), je me permet de commenter juste quelques parties de vos postes:

"la taille du type bool est officielement de 1 octet."
"un bool ne fait quand même qu´un seul octet en mémoire (pas dans les registres, j´y reviens) quelle que soit la machine utilisé "
"Ca me gêne beaucoup ça que les ´bool´ soient une exclusivité C++, car je les utilise pas mal pour les retours de mes fonctions... "

Houla.. (okay c98, mais bon)
ISO/IEC 9899
6.2.5.2/3: "2 An object declared as type _Bool is large enough to store the values 0 and 1." "An object declared as type char is large enough to store any member of the basic
execution character set."

ou sinon

ISO/IEC 14882 (c++)
5.3.3.1: "in particular, sizeof(bool) and sizeof(wchar_t) are implementation defined. sizeof(bool) is not required to be 1".

C´est pas platforme dependant, mais bien pire, implementation dependant.
Sur une meme archi un bool peut etre stocke dans un octet, deux, trois, quatres,...

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment