Adesso... dov'è che era ottimo il mio post? :gren: :gren:Originariamente inviato da internet
Volevo solo aggiungere un particolare all'ottimo post di LeleFT
Ringrazio, comunque, per il complimento.
Molto interessante. Non conoscevo questa cosa. Bene... se ne impara sempre una di nuova.Originariamente inviato da internet
di norma i compilatori usano per le strutture un allineamento a 4 byte sulle architetture a 32 bit (dal 386 fino al P4, AMD inclusa), per cui quando farete
avrete come risultato 4codice:#include <stdio.h> struct bits { unsigned char a0 : 1; unsigned char a1 : 1; unsigned char a2 : 1; unsigned char a3 : 1; unsigned char a4 : 1; unsigned char a5 : 1; unsigned char a6 : 1; unsigned char a7 : 1; }; int main() { printf("%d\n",sizeof(struct bits)); return 0; }
la soluzione è forzare il compilatore ad utilizzare un allineamento al byte per quella struttura.
In gcc e in cl (visual c) basta utilizzare la direttiva
#pragma pack()
ora avrete come risultato 1codice:#include <stdio.h> #pragma pack(1) struct bits { unsigned char a0 : 1; unsigned char a1 : 1; unsigned char a2 : 1; unsigned char a3 : 1; unsigned char a4 : 1; unsigned char a5 : 1; unsigned char a6 : 1; unsigned char a7 : 1; }; #pragma pack() int main() { printf("%d\n",sizeof(struct bits)); return 0; }
quindi se utilizzate un array di queste strutture valutate l'ipotesi di questa direttiva.
Per quale motivo i compilatori usano per le strutture un allineamento a 4 byte sulle architetture a 32 bit?
Per una questione di performance, quindi pesate la vostra scelta tra
1) Consumo di memoria
o
2) Performance
In c++ esiste nella libreria STL la classe bitfield che implementa proprio un "array di bit" a livello astratto tramite operazioni di shift e array di int.
Grazie per le precisazioni.
Ciao.![]()