cs_Lucky92
Messages postés180Date d'inscriptionmercredi 22 décembre 2004StatutMembreDernière intervention16 août 20122 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.
fregolo52
Messages postés1114Date d'inscriptionmercredi 15 juin 2011StatutMembreDernière intervention 6 mai 20214 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).
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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++
Vous n’avez pas trouvé la réponse que vous recherchez ?