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 :

Non compréhension de l'attribute packed


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 231
    Par défaut Non compréhension de l'attribute packed
    Bonjour,

    Simple question de "cours, compréhension du langage :
    Par exemple je suis tombé sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct __atributte__((packed)) mastruct {};
    Donc en fait je souhaiterais simplement savoir se que signifie la deuxième ligne de code avec ce "__atributte__((packed))" qui m'est inconnu ? Et aussi savoir s'il existait d'autre __atribute__ ou truc du genre ? Avez-vous un tutoriel sur DVP ou autre part ?



    Je vous remercie,
    Passez une bonne journée !

  2. #2
    Membre chevronné Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Par défaut
    Bonjour,

    Cet attribut indique au compilateur que les membres de la structure ne doivent pas être alignés sur les adresses mémoire.

    Un processeur accède plus vide à la mémoire quand les données à récupérer sont alignées sur certaines adresses. Par exemple, (avec un alignement sur les adresses multiples de 8) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct not_packed {
      uint16_t data1;
      uint64_t data2;
    };
    data1 et data2 seront alignées sur une adresse multiple de 8, il y auras donc 6 bytes inutilisés ( des bytes de padding) à la suite de data1 pour aligner correctement data2. En mémoire ta structure sera en réalité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct not_packed {
        uint16_t data1;
        uint8_t   padding[6];
        uint64_t data2;
    };
    L'égalité suivante est respectée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sizeof(not_packed) == 16;

    En mode "packed", ces bytes de padding ne sont pas ajouté, la représentation mémoire de ta structure est identique à son écriture. L'égalité suivante est respectée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct __atribute__((packed)) packed{
        uint16_t data1;
        uint64_t data2;
    };
    L'égalité suivante est respectée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sizeof(packed) == 10;

    Tu trouveras plus de doc ici : http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html

  3. #3
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,

    Il y en à d'autres. La syntaxe est dépendante du compilo mais des équivalents existent chez les autres.

    Le fait de packer une struct va supprimer le padding.
    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
    struct __atributte__((packed)) foo {
       char a;
       int b;
    };
     
    struct bar{
       char a;
       int b;
    };
     
    foo f;
    assert(sizeof(foo) == 5);
    assert(&f.b - &f.a == 1);
     
    bar b;
    assert(sizeof(bar) == 8);
    assert(&b.b - &b.a == 4);
    (Pas sur que ça compile )

    edit : fenkys à été plus rapide ^^"

  4. #4
    Membre éclairé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 231
    Par défaut
    Salut,

    Vous êtes au top les gars, réponses super rapides et très complètes ! Je vous remercie de votre temps que vous m'avez accordez.

    Sur ce et

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    L'équivalent sous Visual, ce sont les diverses variantes de #pragma pack.
    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 éclairé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 231
    Par défaut
    Qu'entends-tu de "sous Visual" ?

    Et j'oubliais, je ne comprends pas se qu'est le padding ? (qui signifie rembourrage en français).

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Par "sous Visual", je veux dire "avec le compilateur Microsoft™ Visual C++™". Il ne comprend pas la syntaxe __attribute__, qui est spécifique à GCC.

    Le padding ou bourrage, c'est l'insertion d'espace "non-utilisé" entre deux variables, généralement pour satisfaire les contraintes d'alignement (les variables jusqu'à 8 ou 16 octets alignées sur des multiples de leur taille, les variables plus grandes alignées sur des multiples de 8 ou 16 octets).
    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 Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par Martin Lestas Voir le message
    Qu'entends-tu de "sous Visual" ?
    __attribute__((packed)) fonctionne sous GCC (et surement Clang), sous Visual Studio c'est #pragma pack.

    Citation Envoyé par Martin Lestas Voir le message
    Et j'oubliais, je ne comprends pas se qu'est le padding ? (qui signifie rembourrage en français).
    Par défaut (pas de packing), le compilo va créer des "trous" (=mémoire inutilisée) dans tes structs / classes pour aligner les données sur 4/8 ou 16 octets (généralement l'alignement sur 16 octets il faut le demander, le compilo le fait pas tout seul).

    L'accès à des donnés alignées sur 4/8/16 octets est plus rapide, mais la conso mémoire augmente (dû aux "trous").

    De temps en temps c'est par contre inutile : envoi de données sur le réseau par exemple -> généralement le temps de transfert est supérieur au temps de traitement. Et de temps en temps l'augmentation de la conso mémoire provoque une perte de performance supérieure au gain qu'apporte l'alignement des données (travailler avec des char par exemple, si c'est aligné sur 8 octets ça peut représenter dans le pire des cas 8 fois plus de caches misses).

    De manière générale on y touche pas, il est courant de forcer un alignement sur 16 octets quand on vectorise du code; mais le packing reste rare.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/09/2009, 10h33
  2. Message d'erreur non compréhensible
    Par marsupilami34 dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/01/2008, 09h50
  3. Réponses: 3
    Dernier message: 12/01/2007, 09h42
  4. [Linkage] Non compréhension d'erreur
    Par GLDavid dans le forum VC++ .NET
    Réponses: 6
    Dernier message: 04/01/2007, 14h58
  5. Réponses: 2
    Dernier message: 09/08/2006, 15h06

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