Définition structure

Signaler
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
-
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
-
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

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

Merci Brunews c'est très interessant tout ca !!