Définition structure

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 - 8 nov. 2009 à 23:21
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 - 9 nov. 2009 à 19:03
Bonsoir,

Que signifie la valeur qui suit les ':' d'un membre d'une structure ? (Voir ci-dessous)

typedef struct {
ULONGLONG Member1:48;
ULONG Member2:16;
} MASTRUCT,*LPMASTRUCT;


Merci.

5 réponses

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
9 nov. 2009 à 07:22
Bonjour,

Cette syntaxe permet de définir des champs de bits.
Dans ton exemple, Membre1 est un champ de 48 bits ( sur un entier non signé de 64 bits )et Membre2 est un champ de 16 bits ( sur un entier non signé de 32 bits ).
Par contre ces champs de bits ne sont pas "packés", c'est-à-dire qu'il ne sont consécutifs en mémoire ; pour cela il aurait fallu les déclarer comme suit :

typedef struct {
ULONGLONG Member1:48; //48 premiers bits d'un 64 bits
ULONGLONG Member2:16; //16 bits suivants
} MASTRUCT,*LPMASTRUCT;


Par conséquent, dans ton exemple la définition des champs de bits est inutile.
Cordialement,
Lucky92.
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
9 nov. 2009 à 08:31
Ah les champs de bits !!
Pour ma culture perso.

Lucky si je comprends ce que tu dis :
- la structure de Willy fait 12 octets (taille de ULONGLONG + ULONG)
- ta structure fait 8 octets (parce que le champ de bits tient dans un seul ULONGLONG)

C'est ca ?

(encore un truc affreux à comprendre pour ceux qui viennent de VB).
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
9 nov. 2009 à 16:19
Je sais que ma définition est inutile ici c'est juste la notation des :xx qui m'interessait.
Merci pour l'explication.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 nov. 2009 à 16:23
"La structure de Willy fait 12 octets..."
ben ça serait malheureusement encore trop simple.

Compilée pour OS 32 bits:
- en "PACK 4" alors ok fera 12 octets.
- en "PACK 8" fera 16 octets, le compilo ajoutant un DWORD de cadrage.
A noter que cadrée sur 4, la structure ne souffre d'aucune pénalité car l'adressage 8 n'existe pas sur OS 32 (enfin voués à disparaitre), c'est 4 ou alors 16 pour instructions SSE packées. Le __int64 sur OS 32 n'est rien d'autre qu'une paire de 2 DWORDs (EDX:EAX) et se voit donc adressé en 2 fois.

Compilée pour OS 64:
- C'est 16 octets à tout coup. Adresser 8 octets sur une adresse non multiple de 8 serait gravement nuisible aux perfs.

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
9 nov. 2009 à 19:03
Dans mon cas cette structure doit est alignée à l'octet
#pragma pack(1)

Merci Brunews c'est très interessant tout ca !!
0
Rejoignez-nous