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 :

Structures, padding, optimisations


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Structures, padding, optimisations
    Bonjour,

    Je connais très peu cette notion de padding.

    D'après ce que j'ai cru comprendre, tout champ d'une structure doit commencer à un multiple de sa taille. Si on force la largeur des membres via un champs de bits via la syntaxe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A
    {
        ....
        uint_32t mValue : 5;
        ....
    };
    Puis-je me contenter d'enchaîner les membres, en m'assurant de tomber pile sur les multiples de 32 bits (ou 64 bits) ?

    Si, sur une archi 32 bit, je n'ai besoin que de 30 bits, dois-je explicitement faire un champ de 2 bits que je n'utiliserai pas ?

    Dois-je découper ma structure en plusieurs structure, pour limiter la taille de la structure à 32 ou 64 bits ?

    Si je travaille en 64 bits, et que j'ai besoin d'une structure à 90 bits, la meilleure solution est-elle de faire une classe de 64 bits, et une autre de 32 bits (cette dernière comportant éventuellement des bits de remplissage) ?

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 394
    Points : 5 004
    Points
    5 004
    Par défaut
    la notion de padding, d'alignement et autre c'est surtout pour optimiser les accès (et pour éviter les crashs sur certaines architectures).

    si tu as besoin d'une structure compacte, utilise un #pragma pack.

    le problème de tes questions c'est que c'est dépendant du compilateur, le mieux, c'est de tester en situation, et tu verras ce que ton compilateur te sortira comme tambouille.

  3. #3
    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
    Points : 3 159
    Points
    3 159
    Par défaut
    Citation Envoyé par stardeath Voir le message
    la notion de padding, d'alignement et autre c'est surtout pour optimiser les accès (et pour éviter les crashs sur certaines architectures).
    C'est aussi très utile pour faire de la sérialisation/désérialisation proprement, les données pouvant se transmettre d'une architecture à une autre ! Un #pragma pack(1) est alors bien utile dans beaucoup de cas.

    Oodini: Ce que tu "dois" faire va dépendre de ton objectif. Si tu veux des structures les plus compactes possibles, pragma pack suffira. Tu n'as pas besoin de remplir toi même les octets manquants s'il y en a. Quel résultat cherches-tu à obtenir ?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    C'est effectivement pour faire de la déserialisation.

    Et j'aimerais si possible une solution Windows/Linux.

    Mais vous dites que #pragma pack rend inutile de préciser le nombre de bits ?

  5. #5
    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
    Points : 3 159
    Points
    3 159
    Par défaut
    De toute façon, tu n'alignes pas sur des bits mais sur des octets. La notion de taille (telle que la renvoie sizeof par exemple) se réfère aux octets. Tu peux bien sûr travailler quand même au bit près (encore que, je ne suis même pas sûr) mais ça complique pas mal la tâche ^^.

    #pragma pack(1) va aligner ta structure sur un octet, ce qui signifie que tu n'auras pas de padding.

    Lorsque tu travailles sur la sérialisation/désérialisation, prend garde aux problèmes d'endianess et au conventions en vigueur dans le protocole utilisé. Il me semble par exemple que la convention en vigueur pour les données qui transitent sur un réseau est d'utiliser Big Endian alors que la plupart des plateformes (dont x86) sont en Little Endian (je ne suis pas spécialiste en la matière, pas taper si j'ai dit une connerie).

    Peut-être que protobuf peut te rendre service.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Le mieux pour désérialiser indépendamment de la plate-forme, c'est de ne reposer ni sur pack ni sur l'endianness, et toujours désérialiser byte par byte (voir ce thread par exemple).

    Par contre, si tu sacrifies l'indépendance à la plate-forme, le fait d'utiliser directement une structure packée et compter sur la plate-forme pour avoir la bonne endianness permet d'accéder au contenu du fichier directement avec un mapping mémoire, ce qui est super pour les paresseux.

    La vie est une question de compromis...

Discussions similaires

  1. structure identique optimisation différente
    Par overider dans le forum Requêtes
    Réponses: 0
    Dernier message: 16/03/2011, 11h33
  2. Structure hiériarchique à optimiser (la rendre évolutive)
    Par Greg221 dans le forum Optimisations
    Réponses: 17
    Dernier message: 06/09/2008, 18h32
  3. Desactiver une structure d'optimisation
    Par msami dans le forum Outils
    Réponses: 6
    Dernier message: 23/04/2008, 20h18
  4. padding entre les elements d'une structure
    Par chacal dans le forum Réseau
    Réponses: 5
    Dernier message: 18/11/2005, 08h56
  5. Structure FIFO optimisée à l'accès
    Par guipom dans le forum Langage SQL
    Réponses: 5
    Dernier message: 03/11/2005, 09h56

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