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 :

[struct] tableau d'entiers à nombre de bits fixés


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut [struct] tableau d'entiers à nombre de bits fixés
    Salut,

    c'est à propos de ces déclarations d'entiers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Poke
    {
      ...
      unsigned int move1 : 9;
      unsigned int move2 : 9;
      unsigned int move3 : 9;
      unsigned int move4 : 9;
      ...
    };
    (en fait c'est en C++, donc pas de typedefs...)

    Je voulais savoir si il y a un moyen de faire un tableau de quatre entiers à 9 bits chacun, au lieu de les déclarer comme ça (ca m'aiderait, sinon il faut alourdir le code ou utiliser des pointeurs ou ...)

    peut être comme ça?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct EntierANeufBits
    {
       int x:9;
    };
     
    struct Poke
    {
       EntierANeufBits[4] moves;
    }
    mais à ce moment il faudra passer par une deuxième structure, et on ne pourra plus les manipuler comme des ints.

    Il n'existe pas de manière plus simple?

    Merci,

    Coyote507

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 133
    Par défaut
    Si, on peut stocker tout cela dans 5 octets et faire des décalages avec masque, le tout c'est de faire des fonctions (ou des classes en c++) qui permettent de retrouver ses données.

    De toutes façons le gain de place est illusoire vu que le compilateur alignera probablement les structures en mémoire, ça prendra donc 6 ou 8 octets (mais ça peut être intéressant si on a d'autres données dans la structure).

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Je doute en effet que tu gagnes beaucoup de place.
    En effet, comme ç'a été déjà dit, le compilateur arrondit en fait la taille de la structure à l'octet, et selon la taille de la structure, le compilateur peut rajouter plusieurs octets.
    Par exemple, sur mon ordinateur avec gcc, le compilateur alloue 8 octets, c'est-à-dire 64 bits pour contenir ta structure qui n'en utilise que 36... Donc je doute que ce soit très pratique.

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Certains compilos proposent des extensions pour "packer" une variable ou des structures afin qu'elles prennent exactement la place que l'on souhaite.

    Avec GCC on peut par exemple utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    __attribute__ ((packed))
    voir le manuel de GCC :

    http://gcc.gnu.org/onlinedocs/gcc-4....ble-Attributes

    On peut faire la même chose avec le compilo Microsoft avec le mot clé suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    __declspec(align(#))
    Ceci dit, le packing de variables ou structure est à double tranchant : on gagne de la place (ça reste minimal) mais on perd en performance, notamment avec le "cache miss" dû au mauvais alignement de données.

  5. #5
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Donc en gros si je veux que ce soit plus rapide, au lieu que mes variables prennent 9 bits chacune, je leur fait prendre 16 bits (un short int), même si je n'ai pas besoin d'autant de place.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 14
    Dernier message: 19/07/2009, 03h55
  2. Conversion de binaires en tableau d'entiers 16 bits
    Par Donnie Darcko dans le forum Débuter
    Réponses: 4
    Dernier message: 24/03/2008, 13h29
  3. [Débutant][RISC]Compter le nombre de bit à 1 dans un octet ?
    Par Pill_S dans le forum Autres architectures
    Réponses: 7
    Dernier message: 23/12/2004, 23h24
  4. entiers de 64 bits
    Par jmv dans le forum C++
    Réponses: 11
    Dernier message: 15/09/2004, 20h52
  5. [8086] Affichage d'un entier de 32 bits
    Par elNINIo dans le forum Assembleur
    Réponses: 12
    Dernier message: 10/05/2003, 20h33

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