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 :

Structure + DWORD + WORD => sizeof bizarre


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Structure + DWORD + WORD => sizeof bizarre
    Bonjour à tous ceux qui me liront,

    Je n'ai pas l'habitude de poster des questions, je connais très bien le C/C++ mais aujourd'hui, je tombe sur un os :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef unsigned long int DWORD;    // 32bit
    typedef unsigned short int WORD;     // 16bit
     
    struct test1 { WORD word; };
    struct test2 { DWORD dword; };
    struct test3 { WORD word; DWORD dword; };
     
    ...
     
    cout << sizeof(test1);        //     => 2  : OK
    cout << sizeof(test2);        //     => 4  : OK
    cout << sizeof(test3);        //     => 8  : ARRGHH
    Ma kes ki space ????
    Je suis sous ubuntu 10.4, je dev avec eclipse galileo et je compile avec g++ (the last version normalement).

    Je veux faire quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct mystruct { ... } ex;   //  plein de BYTE(char), WORD, DWORD...
    ifstream in;
    in.read((BYTE*) &ex, sizeof(mystruct));
    Et donc c'est la cata

    Pourquoi lorsque l'on a une structure mélangeant des types 16bit et 32bit il nous met des 32bit à la place des 16bit ?
    There is something qui m'echappe.

    Si un expert de l'implémentation de C++ et qui connait g++ à fond peut donc m'aider à comprendre...

    Merci d'avance

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Ton code est du C++.

    Pour répondre à ton interrogation, c'est une question d'alignement des données en mémoire, pour des questions de performances. Il y a des explications ici : http://fr.wikipedia.org/wiki/Alignement_de_donn%C3%A9es

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Eureka
    Salut,

    Merci pour l'info

    Je vais devoir remplir ma structure champ par champ.
    Je dois écrire un peu plus qu'une seule ligne

    Il doit exister des implémentations de C qui ne font pas d'alignement à mon avis, peut être pour les applis embarquées : optimisation mémoire oblige .
    Ça dépend de ce que l'on veut.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 551
    Points
    218 551
    Billets dans le blog
    118
    Par défaut
    Bonjour,

    Citation Envoyé par hargn Voir le message
    Je vais devoir remplir ma structure champ par champ.
    Je dois écrire un peu plus qu'une seule ligne

    Il doit exister des implémentations de C qui ne font pas d'alignement à mon avis, peut être pour les applis embarquées : optimisation mémoire oblige .
    Ça dépend de ce que l'on veut.
    Ce n'est pas trop une histoire d'implémentation, mais de compilateur et de programmeur.
    IL y avait cette entrée dans la FAQ: http://c.developpez.com/faq/?page=st...#STRUCT_sizeof
    Sinon on peut forcé le compilateur à mettre les données dans la plus petite structure (soit un WORD et un DWORD) avec des commandes pour le précompilateur: http://msdn.microsoft.com/en-us/libr...8VS.80%29.aspx
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    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 518
    Points
    41 518
    Par défaut
    Le mieux pour être portable, serait de lire un chaque champ un octet à la fois (à cause des problèmes d'endianness). Mais si tu veux te limiter aux x86, __attribute__((packed)) pour gcc et #include<pshpack1.h> #include<poppack.h> pour Visual suffisent.
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut j'ai pas dit mon dernier mot
    Le mieux pour être portable, serait de lire un chaque champ un octet à la fois (à cause des problèmes d'endianness)
    Là j'ai pas ce problème vu que le fichier que je veut lire est en petit-boutiste.
    D'ailleurs s'il n'y avait pas ce problème d'alignement, j'aurai juste à charger le fichier en mémoire, et mon parser aurait juste eu besoin de mettre les valeurs des pointeurs de mes structure à la bonne adresse.
    Ça aurait été la solution la plus simple pour moi et optimale en coût proc/mem.

    Ce n'est pas trop une histoire d'implémentation, mais de compilateur et de programmeur.
    Et si car c'est le compilateur qui définit l'implémentation du langage (c'est le sujet de mon cours sur l'implémentation des langages objets), on peut dire que c'est le compilo qui implémente le langage.
    Et donc on modifie l'implémentation en filant des params au compilo.
    Après c'est au programmeur de ce débrouiller avec la façon dont c'est implémenté (et donc de se débrouiller quand ça colle pas comme il voudrait : par exemple ces fichus structures ne fonctionnant pas comme ça devrait à cause de question d'optimisation)

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

Discussions similaires

  1. sizeof() d'une structure
    Par tut dans le forum MFC
    Réponses: 12
    Dernier message: 29/08/2006, 18h21
  2. sizeof et structure
    Par titoine1978 dans le forum C++
    Réponses: 9
    Dernier message: 01/03/2006, 08h47
  3. dword et word
    Par badin dans le forum VBA Word
    Réponses: 3
    Dernier message: 20/11/2005, 15h32
  4. taille de structure bizarre ...
    Par lyrau dans le forum C
    Réponses: 3
    Dernier message: 20/11/2003, 10h46

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