Définition structure

Messages postés
2377
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
- - Dernière réponse : cs_Willi
Messages postés
2377
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.
Afficher la suite 

5 réponses

Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
0
Merci
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.
Commenter la réponse de cs_Lucky92
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
0
Merci
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).
Commenter la réponse de fregolo52
Messages postés
2377
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
16
0
Merci
Je sais que ma définition est inutile ici c'est juste la notation des :xx qui m'interessait.
Merci pour l'explication.
Commenter la réponse de cs_Willi
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
"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++
Commenter la réponse de BruNews
Messages postés
2377
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
16
0
Merci
Dans mon cas cette structure doit est alignée à l'octet
#pragma pack(1)

Merci Brunews c'est très interessant tout ca !!
Commenter la réponse de cs_Willi