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 :

question sur l'alignement


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut question sur l'alignement
    bonjour à tous,

    voila si j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct A{
        int m_value ;
        char c;
    }
     
    struct B{
        int m_value;
        char c;
    }__attribute__((packed))
    B aura une taille de 5 octets alors que la structure de A aura une taille de 8 octets. Le compilateur rajoute des octets de padding mais pourquoi?

    sur un pc 64 bits, le bus de donné et de 128 bits, donc on peut recupérer a chaque coup d'horloge jusqu'a 16 octets de mémoire. Donc si mon processus a besoin de récupérer la valeur de m_value quel est l'interet
    d'ajouter des octets de padding. ca ne va rien changer car je peux lire facilement mon/mes octets avec ou sans padding. Je pense que mon probleme de compréhesion est plus un probleme hardware que logiciel mais je poste quand meme ici.

    Merci d'avance pour votre aide

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    La réponse dépend du processeur que tu utilises.
    Pour la plupart des processeurs, tel qu'il ont été câblés ils ne peuvent accéder aux données que si elles sont alignées. Ainsi un nombre entier sur 4 octets n'est directement lisible que si sont adresse est un multiple de 4. D'où la nécessité d'agrandir la structure pour garantir que l'entier est toujours à une adresse multiple de 4.
    Et plus le bus est large, plus ceci devient un problème pour le processeur, donc tous les processeurs 64 bits ont forcément le problème.

    Si on prend la structure "packed", l'entier ne sera pas aligné donc sera illisible tel quel par la processeur. Tous les accès à cet entier se feront en effectuant 4 lectures d'octets puis un regroupement (le compilateur se charge d'ajouter les instructions assembleurs nécessaires). Conséquences : un code plus gros et un temps d'accès au donnes multipliés par 3 environ!
    D'où ne jamais jamais utiliser de structure "packed"' à moins d'avoir une très bonne raison.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut
    pourtant si je fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct B b;
    b.m_value = 12;
    b.c = 'f';
     
    	printf("m_value = %i, char = %c\n", b.m_value, b.c);
    le terminal me retourne bien les bonnes valeurs

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Citation Envoyé par cosmoff Voir le message
    pourtant si je fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct B b;
    b.m_value = 12;
    b.c = 'f';
     
    	printf("m_value = %i, char = %c\n", b.m_value, b.c);
    le terminal me retourne bien les bonnes valeurs
    Oui car
    Citation Envoyé par dalfab Voir le message
    Si on prend la structure "packed", l'entier ne sera pas aligné donc sera illisible tel quel par la processeur. Tous les accès à cet entier se feront en effectuant 4 lectures d'octets puis un regroupement (le compilateur se charge d'ajouter les instructions assembleurs nécessaires)
    Le code généré va se tordre pour extraire b.m_value et le printf va bien recevoir le nombre entier attendu en paramètre.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par cosmoff Voir le message
    Le compilateur rajoute des octets de padding mais pourquoi?
    Il y a aussi une histoire de tableaux.
    Si tu crées un tableau de "struct X", (ex struct X tab[10000]), les accès à tab[n] seront plus rapides si "struct X" a une taille d'une puissance de 2 (2, 4, 8, 16, 32, 64, 128, ...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Il y a aussi une histoire de tableaux.
    Si tu crées un tableau de "struct X", (ex struct X tab[10000]), les accès à tab[n] seront plus rapides si "struct X" a une taille d'une puissance de 2 (2, 4, 8, 16, 32, 64, 128, ...)
    Bonjour.

    Je m’immisce dans la conversation 😁.

    Une espèce d’intuition me vient mais je sens que je suis dans l’erreur. Je pose donc ma question.

    L'accès aux données en lecture ne serait-il pas plus rapide avec une liste chaînée plutôt qu’avec un simple tableau ?

    Je me dis que côté assembleur il doit être plus rapide d’accéder à une donnée en lui donnant directement l’adresse plutôt que de faire des regroupements d’octets...

  7. #7
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonsoir,

    Citation Envoyé par dalfab Voir le message

    Si on prend la structure "packed", l'entier ne sera pas aligné donc sera illisible tel quel par la processeur. Tous les accès à cet entier se feront en effectuant 4 lectures d'octets puis un regroupement (le compilateur se charge d'ajouter les instructions assembleurs nécessaires). Conséquences : un code plus gros et un temps d'accès au donnes multipliés par 3 environ!
    D'où ne jamais jamais utiliser de structure "packed"' à moins d'avoir une très bonne raison.
    Attention ce n'est pas l'entier qui est illisible ou qui le devient, c'est l'adresse mémoire qui devient invalide, car effectivement, sur certaines architectures, on a besoin des adresses alignées cas contraire, cela se solde par une "erreur bus" tel est le cas avec des architectures telles que SPARC qui ne gère pas des adresses impaires contrairement à des architectures hybrides ou ceux de la famille Intel.

    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    L'accès aux données en lecture ne serait-il pas plus rapide avec une liste chaînée plutôt qu’avec un simple tableau ?
    Moi je dirais non voire un tableau c'est mieux

    Parce qu'un tableau c'est techniquement une adresse plus un décalage. Et une addition coûte moins en temps qu'un déférencement.
    L'avantage du tableau, c'est que lorsque le processeur va lire une valeur dans ton tableau, il va mettre en cache une partie du tableau. Donc les lectures contiguës vont coûter cacahuète.

    Mais bon ce sont les avantages et les inconvénients des structures de données connus depuis 15-20 ans : rien de neuf

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il y a aussi des considérations pour la synchronisation: Sous Windows sur x64, une lecture ou écriture n'est atomique que sur un entier correctement aligné, et les opérations atomiques comme InterlockedIncrement() nécessitent également que la variable soit alignée.
    Il est possible que cela soit lié à la pagination mémoire: Un entier non-aligné risque de se retrouver à cheval sur deux pages de mémoire, ce qu'un entier aligné évite.
    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.

Discussions similaires

  1. Questions sur l'alignement des adresses
    Par unomadh dans le forum C++
    Réponses: 4
    Dernier message: 21/07/2011, 16h34
  2. Question facile sur l' Alignement
    Par GLSpirit dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 10/09/2008, 15h01
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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