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 :

Comment réserver mémoire pour des données de 80bits


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Par défaut Comment réserver mémoire pour des données de 80bits
    Bonjour à tous,
    dans un struct déjà conçu pour une taille fixée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct TOTO1
    {
     short int Data[100];
     byte Reserve[15];
    }
    Sur la taille total de Struct, j'ai 225 bytes.
    Maintenant, je voudrais ajouter un tableau de 80bits en bool:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct TOTO1
    {
     short int Data[100];
     bool  Test[80];    // pour moi, Test doit occuper 10 bytes
     byte Reserve[5];
    }
    Au final, la taille de TOT2 est bien > celle de TOTO1

    Ce que je veux est de garder la même taille TOTO1 et TOTO2.

    Merci d'avance pour m'aider de trouver une solution.
    Xavier

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    C'est peut-être de bitset dont tu as besoin, utilisable comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct Toto {
    short int Data[100];
    std::bitset<80> Test;
    byte Reserve[5];
    };

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Est-ce que le standard garantit que le contenu du bitset est dans l'objet lui-même, et non dans un tableau alloué par new dont l'objet contiendrait un pointeur?
    Si oui, OK, sinon, on se retrouve à reposer sur un détail d'implémentation.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Ne faudrait-il pas plutôt jouer avec les pragma pack ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Ça ne changera pas la taille d'un bool.
    Si tu veux intercaler un champ de 80 bits entre deux autres champs, le plus simple est un tableau de 10 char (ou (80+CHAR_BIT-1) / CHAR_BIT char si on veut supporter des architectures ésotériques) plus un #pragma pack(1).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    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
    Salut

    Moi aussi j'avais pensé à l'alignement au début, mais la réponse de cob est correcte. Le code parle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <bitset>
    #include <iostream>
     
    namespace notalign {
    struct toto1
    {
      short int Data[100];
      char Reserve[15];
    };
     
    struct toto2
    {
       short int data[100];
       bool  test[80];    // pour moi, test doit occuper 10 bytes
       char reserve[5];
    };
     
    struct toto3 {
      short int D;
      std::bitset<80> Test;
      char Reserve[5];
    };
    }
     
    namespace align {
    #pragma pack(1)
    struct toto1
    {
      short int Data[100];
      char Reserve[15];
    };
     
    #pragma pack(1)
    struct toto2
    {
       short int data[100];
       bool  test[80];    // pour moi, test doit occuper 10 bytes
       char reserve[5];
    };
     
    #pragma pack(1)
    struct toto3 {
      short int D;
      std::bitset<80> Test;
      char Reserve[5];
    };
    }
     
    int main() {
      std::cout
        << sizeof(notalign::toto1) << "\n"
        << sizeof(notalign::toto2) << "\n"
        << sizeof(notalign::toto3) << "\n"
        << sizeof(align::toto1) << "\n"
        << sizeof(align::toto2) << "\n"
        << sizeof(align::toto3) << "\n"
        << std::endl;
      return 1;
    }
    Affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    216
    286
    32
    215
    285
    23

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    si bitset<> ne contenait que les 80 bits, la taille de align::toto3 devrait être 17 octets, pas 23. Il y a donc plus, ou un alignement forcé.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre éclairé
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Par défaut
    Merci de vos réactions.
    Ce que je veux est d'insérer un tableau de 80 variables booléens dans un struct existant, bien sure, la taille de struct est limitée et il y a un trou de dizaine d'octets. Je ne peux pas trop changé le struct pour la compatibilité avec l'ancienne version de mon programme.
    Xavier

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    La doc précise que std::bitset<N> est essentiellement un std::array<bool,N>, avec un rangement plus optimal (déjà utilisé par std::vector<bool>) et quelques constructeurs/méthodes purement utilitaires.

  10. #10
    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 fait que le constructeur de bitset soit noexcept impose qu'il ne fasse pas d'allocation dynamique.
    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.

Discussions similaires

  1. [WD18] comment changer la taille des données d'une table mémoire?
    Par oumarsaw dans le forum WinDev
    Réponses: 3
    Dernier message: 21/03/2015, 20h29
  2. Réponses: 1
    Dernier message: 16/03/2015, 21h53
  3. Comment entrer et sortir des données?
    Par Antigonos Ier Gonatas dans le forum Général Python
    Réponses: 2
    Dernier message: 13/06/2006, 20h57
  4. Réponses: 11
    Dernier message: 27/05/2006, 00h07

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