2010-12-06 8 views
1
C++

Mon application a une structure définie:Sizeof rapports incorrect Taille de la structure définie type -

typedef struct zsSysVersionMsg_tag 
{ 
    WORD cmd; 
    BYTE len; 
} zsSysVersionMsg_t; 

je me attends sizeof(zsSysVersionMsg_t) d'évaluer à 3. Cependant, quand je lance mon application, il évalue à 4. Can Quelqu'un explique pourquoi c'est? (J'ai vraiment besoin d'évaluer à 3.) Merci.

+0

standard dit qu'il évaluera à> = wizeof (MOT) + sizeof (BYTE), pas necesarrily exactement –

Répondre

2

La plupart des plates-formes structures « align » et « pad » de sorte qu'ils commencent et se terminent exactement sur une limite de mot. Ceci est fait pour améliorer les performances de la mémoire.

En supposant que vous êtes sous Windows, vous pouvez définir votre propre alignement. Dans votre cas, vous souhaitez aligner sur les octets, donc faire:

#pragma pack(push, 1) 
typedef struct zsSysVersionMsg_tag 
{ 
    WORD cmd; 
    BYTE len; 
} zsSysVersionMsg_t; 
#pragma pack(pop) 
+0

Merci, John. Est-ce que le '#pragma pack (push, 1)' indique un alignement sur un seul octet, ou ajoute-t-il simplement un seul octet de remplissage? Je demande parce que je reconnais les instructions «pousser» et «pop» de mes jours de réunion, et (pas que je doute de vous, mais) je ne vois pas comment ces instructions vont aider. Aussi, ai-je besoin de mettre ces instructions 'pragma' autour de chaque définition de type, ou puis-je faire quelque chose comme' pragrma, typedef, typedef, typedef, pragma'? –

+0

le '1' lui dit d'aligner sur une limite de 1 octet. "pousser" et "pop" font ce que vous pensez. ils poussent et font sauter l'alignement précédent. –

Questions connexes