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 :

sizeof et structure


Sujet :

C++

  1. #1
    Membre confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut sizeof et structure
    Bonjour,

    J'ai cette structure quelque part dans un prog C++

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct _DAYINDEX
    {
    	short recordsInDay;  
    	long startPos;		
    } DAYINDEX; 
     
    DWORD toto=sizeof(DAYINDEX);
    Un sizeof() sur cette structure me donne 8.
    Le short est sensé tenir sur 2 bytes et le long sur 4 bytes, donc je devrais obtenir 6 pour le sizeof().
    Je ne comprends pas. Il y a surement quelquechose qui m'a échappé.
    DEVC++ comme VC++

    Merci.
    Antoine.

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    En gros, les adresses des données sont généralement alignées modulo 4 octets (dans un système 32 bits). Ton short fait 2 octets + 2 octets de padding pour l'alignement.

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Il existe une commande ( non standard je pense) avec pragma qui te permet d'aligner tout cela.

  4. #4
    Membre confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut
    Merci Herode.
    Je ne savais pas...mefiance sur les sizeof maintenant (que j'utilise dans la lecture de structures dans des fichiers).

  5. #5
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Le sizeof est fiable, heureusement. Ca ne devrait donc pas poser de problèmes tant que les nombres enregistrés dans le fichier l'ont été en mode binaire.

  6. #6
    Membre confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut
    Le problème c'est que le sizeof() me renvoit trop de bytes à lire, et donc le cursor du fichier se retrouve quelque part dans l'enregistrement suivant, et non pas à son debut. Je peux le repositionner avec un seek, mais ca fait perdre en performance.

    Maintenant tout fonctionne bien en supprimant le sizeof() et en indiquant la taille réélle de l'enregistrement.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Si les données ne sont pas alignées de la même manière dans le fichier et dans la structure (mémoire), il ne faut pas lire structure par structure, mais champ par champ.

  8. #8
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Avec GCC, Il est possible de "désaligner" les éléments de la structure (voir citation).

    Use __attribute__((packed)) as needed to force the use of unaligned members. For instance

    struct foo { char x; short y; int x; } __attribute__((packed));
    has size 7 (for all targets worth mentioning; discussion of type sizes later). The compiler will emit unaligned loads in whatever form necessary for the target. Note that the compiler does know that ia32 can perform the unaligned load in hardware, and so does nothing special.
    For slightly better performance on particular structures on systems that don't do unaligned loads in hardware, use packed on individual structure members:

    struct bar { int a; int b; char c; int d __attribute__((packed)); };
    This differs from foo in that the structure as a whole has alignment 4, rather than alignment 1. This does affect how the structure may be aligned in memory, but if you're doing freads of individual structures you don't care. Anyway, the knowledge that a and b are sufficiently aligned allows the compiler to always emit direct loads.

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Citation Envoyé par Volune
    Si les données ne sont pas alignées de la même manière dans le fichier et dans la structure (mémoire), il ne faut pas lire structure par structure, mais champ par champ.
    Et traiter en plus l'endianness.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Citation Envoyé par hegros
    Il existe une commande ( non standard je pense) avec pragma qui te permet d'aligner tout cela.
    Cela existe, mais c'est dépendant du compilateur

Discussions similaires

  1. Structure + DWORD + WORD => sizeof bizarre
    Par hargn dans le forum Débuter
    Réponses: 5
    Dernier message: 22/11/2010, 17h25
  2. sizeof et structure
    Par ben78 dans le forum Débuter
    Réponses: 5
    Dernier message: 31/07/2007, 12h52
  3. sizeof() d'une structure
    Par tut dans le forum MFC
    Réponses: 12
    Dernier message: 29/08/2006, 18h21
  4. recuperation de la structure d'une base
    Par pascalT dans le forum 4D
    Réponses: 7
    Dernier message: 07/06/2006, 15h32
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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