IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Apprendre le C++ : petits problèmes


Sujet :

C++

  1. #21
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Le type bool existe vraiment, car on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void f(bool b) {}
    void f(int i) {}
    void f(char c) {}
    void f(n'importe quoi d'autre) {}
    alors que si bool était un simple typedef vers un un autre type, cette surcharge ne serait pas permise.

    Donc, ça change les choses par ailleurs.

    Par contre, bool ne fait pas 1 bit, mais je ne vois pas en quoi ça a le moindre rapport avec le fait qu'il soit un type ou pas. Après tout, double est bien un type, mais demande plus d'1 bit de stockage.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  2. #22
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    <HS>
    @ Pierre Dolez : Qu'est ce qui empêche de créer un type booléen qui ne prendrait qu'un bit ? C'est un problème technique (hardware) ou juste une convention comme quoi la plus petite unité est l'octet ?
    </HS>

  3. #23
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Si le type booléen existait réellement, chaque valeur d'une variable déclarée bool ne prendrait que 1 bit.
    Pourquoi?

    C'est quoi un type pour toi?

  4. #24
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    <HS>
    @ Pierre Dolez : Qu'est ce qui empêche de créer un type booléen qui ne prendrait qu'un bit ? C'est un problème technique (hardware) ou juste une convention comme quoi la plus petite unité est l'octet ?
    </HS>
    C'est complètement hardware. Les registres, le séquenceur et l'unité de calcul des processeurs ne sont pas conçus pour gérer une granularité inférieure à l'octet.

  5. #25
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    <HS>
    @ Pierre Dolez : Qu'est ce qui empêche de créer un type booléen qui ne prendrait qu'un bit ? C'est un problème technique (hardware) ou juste une convention comme quoi la plus petite unité est l'octet ?
    </HS>
    En C et en C++, un type a une taille qui est un nombre entier de bytes.

    Citation Envoyé par jblecanard Voir le message
    C'est complètement hardware. Les registres, le séquenceur et l'unité de calcul des processeurs ne sont pas conçus pour gérer une granularité inférieure à l'octet.
    Quel est le probleme? Il y a des langages -- Ada par exemple -- qui gere parfaitement ce genre de situations. Une generalisation des bitfields de C et de C++ en quelque sorte.

  6. #26
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Quel est le probleme? Il y a des langages -- Ada par exemple -- qui gere parfaitement ce genre de situations. Une generalisation des bitfields de C et de C++ en quelque sorte.
    Tu peux t'amuser à stocker plusieurs booléens sur un même octet, mais tu gères toi même la notion de bitfield, ce n'est pas le processeur qui le fait. Rendre le stockage des types bool répartis sur des bitfields est possible, mais c'est une opération de trop haut niveau par rapport à C++. Et ça devient même carrément casse tête par rapport à la libération de la mémoire, etc...

    Bref c'est 100 fois plus simple pour le compilo de prendre un octet et de pas s'emmerder.

  7. #27
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Mais si je fais un vector<bool> de taille 1, j'ai bien un bool stocké sur un seul bit, il gère ca comment ? Il reserve un octet et n'en utilise qu'un seul bit ?

  8. #28
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Mais si je fais un vector<bool> de taille 1, j'ai bien un octet stocké sur un seul bit, il gère ca comment ? Il reserve un octet et n'en utilise qu'un seul bit ?
    Un bit stocké sur un octet . Oui c'est ça, il utilise un octet complet. Après si tu veux gérer un grand nombre de booléens, c'est mieux d'utiliser des bitfields. Mais sinon franchement on s'en fout, vu la complexité des applis modernes et la puissance de nos machines, on va pas chouiner pour quelques octets.

    Edit : c'est aussi là au cas ou vous douteriez des mes dires.

  9. #29
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    J'ai édité, je voulais dire "un bool stocké sur un bit". bitfields et std::vector<bool>, ont pas la même utilité de tout façon, même si le stockage est le même.

    Edit: Je ne doute pas, je sais que c'est la même taille, me demandait seulement pourquoi ce n'était pas su un seul bit

  10. #30
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Pardon pour ma formulation, je voulais juste appuyer mes propos par un lien .

    Au niveau de l'adressage mémoire, on ne peut pas descendre en dessous de l'octet. Il paraît que certains compilos gèrent les booléens sur des bitfields automatiquement, mais je n'arrive pas à trouver d'exemple...

  11. #31
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Tu peux t'amuser à stocker plusieurs booléens sur un même octet, mais tu gères toi même la notion de bitfield, ce n'est pas le processeur qui le fait. Rendre le stockage des types bool répartis sur des bitfields est possible, mais c'est une opération de trop haut niveau par rapport à C++.
    On est d'accord que le modele du C++ ne le permet pas.

    Mais ce n'est pas qqch d'intrinseque, ni a la notion de type, ni au hard.

    (En passant, il y a des processeurs qui permettent de manipuler les bits individuellements, et le faire pour un processeur qui ne le permet pas est d'une complexite nettement moindre que gerer les exceptions).

    Et ça devient même carrément casse tête par rapport à la libération de la mémoire, etc...
    Je ne vois pas de problemes. Les allocateurs fonctionnent deja avec des unites nettement plus grande qu'un byte.

  12. #32
    Invité
    Invité(e)
    Par défaut
    Bonjour JoliLoic,
    Le type bool existe vraiment, car on peut écrire :
    Code :

    void f(bool b) {}
    void f(int i) {}
    void f(char c) {}
    void f(n'importe quoi d'autre) {}


    alors que si bool était un simple typedef vers un un autre type, cette surcharge ne serait pas permise.
    Mon compilateur l'accepte très bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef char NBOOL;
    void foo(NBOOL b){return;}
    int main(int argc, char* argv[])
    {
    foo('a');
    }
    En C++ bool n'est pas un typedef, mais un mot-clé.

  13. #33
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Y'a pas de surcharge là...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef char NBOOL;
     
    void foo(NBOOL){}
    void foo(char) {}
     
    int main()
    {
      foo('a');
    }
    c'est ça que mettait en avant Loic. Et oui bool n'est pas un typedef, bool est un type primitif au même titre que int etc

    Et histoire de pas parler dans le vide :

    norme p3.9.1 :
    6. Values of type bool are either true or false.42) [Note: there are no signed, unsigned, short, or
    long bool types or values. ] As described below, bool values behave as integral types. Values of type
    bool participate in integral promotions (4.5).
    7. Types bool, char, wchar_t, and the signed and unsigned integer types are collectively called integral
    types.

  14. #34
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    (En passant, il y a des processeurs qui permettent de manipuler les bits individuellements, et le faire pour un processeur qui ne le permet pas est d'une complexite nettement moindre que gerer les exceptions).
    Comme le dit si bien le type sur StackOverflow, c'est un compromis entre mémoire utilisée et perfos. C'est plus rapide de prendre un octet complet et de n'utiliser qu'un bit que de faire des calculs avec des décalages de bits.

    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Je ne vois pas de problemes. Les allocateurs fonctionnent deja avec des unites nettement plus grande qu'un byte.
    Je ne vois pas le rapport, puisqu'on parle de descendre en dessous du byte .

    Plus sérieusement, le fait que l'allocateur alloue de base beaucoup plus qu'un octet est géré par l'OS donc à un autre niveau. Maintenant imagine que tu écris ton compilateur. A chaque nouveau booléen, il faut aller le mettre dans un octet ou il y a "encore de la place". Et quand tu le détruis, il faut vérifier que l'octet ne contient pas d'autres booléens qui ne doivent pas être détruit, etc... Bref c'est assez complexe ! Alors que prendre un octet et le détruire au moment de détruire le booléen, et bah c'est tout simple.

    J'ai comme l'impression qu'on est en train de sombrer tout droit dans le hors sujet là

  15. #35
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Je ne suis pas tout à fait d'accord : c'est intrinsèque au hard dans une grande majorité d'architecture. Tu ne peux pas adresser de zone mémoire plus petite que un octet sur ton pc ou ton mac.
    Pas plus que tu ne peux adresser des zones plus grande que 16, 18, 32, 36, 64, 80 ou 128 bits. Ca n'empeche pas les compilateurs de fournir ce qu'il faut quand c'est utile.

    Comme le dit si bien le type sur StackOverflow, c'est un compromis entre mémoire utilisée et perfos. C'est plus rapide de prendre un octet complet et de n'utiliser qu'un bit que se faire des calculs avec des décalages de bits.
    Tu me permettras de ne pas etre d'accord? La raison indiscutable pour laquelle les bool font (au minimum) 1 byte en C++, c'est que le modele du C++ ne permet pas des types plus petits et que quand on a introduit les bool, celui-ci etait deja suffisamment etabli pour que le modifier n'etait pas envisageable.

    On peut considerer que meme si ca avait ete envisageable, le resultat n'aurait pas ete change parce que c'est un bon compromis. Le point de vue se tient mais ca me semble pas si certain que cela.

    Je ne vois pas le rapport, puisqu'on parle de descendre en dessous du byte .
    Tu dis que gerer des bits serait infernal dans les allocateurs. Je te dis que je ne vois pas pourquoi ils auraient a faire autre chose pour les bits que ce qui est deja fait pour les bytes: arrondir a une unite superieure gerable.

    Plus sérieusement, imagine que tu écris ton compilateur.
    Been there, done that.

    A chaque nouveau booléen, il faut aller le mettre dans un octet ou il y a "encore de la place". Et quand tu le détruis, il faut vérifier que l'octet ne contient pas d'autres booléens qui ne doivent pas être détruit, etc... Bref c'est assez complexe !
    Je ne vois pas en quoi c'est complexe. Il n'y a rien a faire pour detruire un bool. Il ne faut s'occuper que de l'allocation de la memoire. On a simplement un type avec des contraintes d'alignement differentes et on gere ca comme on gere les types actuels avec leurs contraintes d'alignement. (Note que j'envisagerais d'aligner les bool sur les bytes en dehors des tableaux -- un autre compromis qui serait rendu possible en ayant des bools ayant une taille de 1 bit).

    Alors que prendre un octet et le détruire au moment de détruire le booléen, et bah c'est tout simple.
    C'est quoi detruire un octet?

  16. #36
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 492
    Par défaut
    Dites donc, ça fait un bon bout de temps que vous n’avez pas vu du code assembleur ou quoi ?

    Les opcodes utilisant les registres de flags, qui font tous un bit, pullulent sur les CPU x86 (même en 64 bits avec ligne de cache 256 bytes et mode burst).

    Un bit c'est un bit, pas un byte camouflé.

    P.S.: bool est un type primitif ET un mot réservé du C++ (comme int ...).

  17. #37
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Tu me permettras de ne pas etre d'accord? La raison indiscutable pour laquelle les bool font (au minimum) 1 byte en C++, c'est que le modele du C++ ne permet pas des types plus petits et que quand on a introduit les bool, celui-ci etait deja suffisamment etabli pour que le modifier n'etait pas envisageable.

    On peut considerer que meme si ca avait ete envisageable, le resultat n'aurait pas ete change parce que c'est un bon compromis. Le point de vue se tient mais ca me semble pas si certain que cela.
    C'est donc surtout historique, intéressant .

    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    C'est quoi detruire un octet?
    Libérer la mémoire, s'entend. Mais il est vrai que le problème est exactement le même quand tu adresse des zones mémoires plus grande qu'un octet et que tu y stockes des char. J'ai trop souvent tendance à vouloir imaginer l'assembleur qui sort derrière le C++ que j'écris, et je pense avec des simples registres 8 bits exclusivement >_<.


    Citation Envoyé par bacelar Voir le message
    Dites donc, ça fait un bon bout de temps que vous n’avez pas vu du code assembleur ou quoi ?
    Force est de constater que oui pour ma part.

    Citation Envoyé par bacelar Voir le message
    Les opcodes utilisant les registres de flags, qui font tous un bit, pullulent sur les CPU x86 (même en 64 bits avec ligne de cache 256 bytes et mode burst).

    Un bit c'est un bit, pas un byte camouflé.
    Mais il reste vrai que le booléen de C++ est un byte

  18. #38
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Je ne vois pas le rapport entre la taille de bool en C++ et le reste.
    int, short et long peuvent avoir la même taille, et pourtant il s'agit de trois types, et non seulement de mot clés. Pourquoi chercher à faire une exception avec bool?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  19. #39
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Tu me permettras de ne pas etre d'accord? La raison indiscutable pour laquelle les bool font (au minimum) 1 byte en C++, c'est que le modele du C++ ne permet pas des types plus petits et que quand on a introduit les bool, celui-ci etait deja suffisamment etabli pour que le modifier n'etait pas envisageable.
    Est-ce le modèle du C++ ou celui des architectures sur lesquelles il tourne en général ?

    Parce que si bool prend 1 unique bit, comment est défini bool* ?

    Il me semble qu'avoir un type qui tienne moins en mémoire que l'unité de l'espace d'adressage est très problématique dans un langage à pointeurs. Ou alors tu englobes ça dans le "modele du C++" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct pair_bool
    {
        bool b1; // 1 bit
        bool b2; // 1 bit
    } // pair_bool fait 2 bits, donc sizeof(pair_bool) == 1 byte
     
    void fail()
    {
        pair_bool b;
        b.b1 = true;
        b.b2 = false;
        bool* pb = &b.b2; // que vaut pb si sizeof(pair_bool) == 1 ?
    }

  20. #40
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Mais il reste vrai que le booléen de C++ est un byte
    Non, par exemple, std::vector<bool> est justement spécialisé pour les gérer en tant que bit unitaires.

Discussions similaires

  1. un petit problème d'algo
    Par supertramp dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 12/10/2004, 20h13
  2. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo