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 :

Une histoire d'alignement


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dafpp
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 345
    Par défaut Une histoire d'alignement
    Bonjour, tout est écrit dans le code:
    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
     
    typedef union 
        { 
            char t[20]; 
            struct 
            { 
                char s[10]; 
                union 
                { 
                   char b[4]; 
                   unsigned int v :32; 
                } b; 
                char ss[6]; 
            } s; 
        } u; 
     
        u k; 
        memset (&k, 0, sizeof(u)); 
     
        k.t[10] = (char)1; 
        k.t[12] = (char)2; 
        k.t[16] = (char)3; 
        printf ("k.t[10] = %d\nk.t[12] = %d\nk.t[16] = %d\nsizeof(k.s.b) = %d\nPourquoi k.s.b ne commence qu'à k.t[12] alors que l'element k.s.s ne fait que 10 octets, l'élement devrait commencer à k.t[10], non ? Donc il y a 2 octets qui ne sont normalement pas utilisable, car ils sont entre k.s.s et k.s.b ... Je ne comprends pas ce résultat.\nQuand je remplace l'union k.s.b par un type char[4], ça s'aligne bien, mais au contraire si je mets un entier ... ça me refait la même chose que actuelement. J'en déduis que  c'est à cause de mon entier, mais dans ce cas pourquoi ? Pourquoi ça ne s'alligne pas comme pour mon char[4] ... Je peux réduire de 2 octets l'élement précedent pour avoir un bon alignement, mais ça serait bidouiller, et je ne sais pas si ça généralise sur toutesl es machines ...", k.s.s[10], k.s.b.b[0], k.s.ss[0], sizeof(k.s.b));
    Pourquoi k.s.b ne commence qu'à k.t[12] alors que l'element k.s.s ne fait que 10 octets, l'élement devrait commencer à k.t[10], non ? Donc il y a 2 octets qui ne sont normalement pas utilisable, car ils sont entre k.s.s et k.s.b ... Je ne comprends pas ce résultat.
    Quand je remplace l'union k.s.b par un type char[4], ça s'aligne bien, mais au contraire si je mets un entier ... ça me refait la même chose que actuelement. J'en déduis que c'est à cause de mon entier, mais dans ce cas pourquoi ? Pourquoi ça ne s'alligne pas comme pour mon char[4] ... Je peux réduire de 2 octets l'élement précedent pour avoir un bon alignement, mais ça serait bidouiller, et je ne sais pas si ça généralise sur toutesl es machines ...
    merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    Ca dépend de la valeur de l'alignement défini dans le compilateur.

    Si tu fais joujou avec #pragma pack() pour forcer l'alignement, tu verras que les valeurs changent.

  3. #3
    Membre éclairé Avatar de dafpp
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 345
    Par défaut
    Je pense que ce n'est pas trop conseillé n'est ce pas ?

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    Non faut savoir ce qu'on faut !!
    Mais des fois c'est pratique pour de la comm cross plateforme.

    A priori ton compilo aligne à 4 octets.

  5. #5
    Membre éclairé Avatar de dafpp
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 345
    Par défaut
    Dans ce cas comment je peux être sûr que sur d'autre machines quand je vais compiler ça marchera pareil, je ne peux pas ?
    Le mieux est de faire quoi dans ce cas ?

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Tu initialise ta structure de donnés avec k.t et tu accèdes aux donnés via k.s. Le comportement est indéterminé selon la norme, à moins que ton union contienne des structure avec une séquence initiale commune.

    Avec mes meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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

Discussions similaires

  1. Une histoire de compte à rebours (avec formulaire)
    Par Olivier14 dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 04/03/2009, 13h43
  2. encore une histoire de transparence
    Par mathou810 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 28/09/2006, 13h45
  3. Une histoire de popup
    Par zoidy dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 02/06/2006, 14h39
  4. Une histoire de lien...
    Par sloshy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 25/08/2005, 23h13
  5. [JAR][debutant] encore une histoire de classpath
    Par blaz dans le forum Général Java
    Réponses: 6
    Dernier message: 27/07/2005, 12h28

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