Originariamente inviato da internet
Volevo solo aggiungere un particolare all'ottimo post di LeleFT
Adesso... dov'è che era ottimo il mio post? :gren: :gren:
Ringrazio, comunque, per il complimento.
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

codice:
#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;
}
avrete come risultato 4

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()

codice:
#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;
}
ora avrete come risultato 1

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.
Molto interessante. Non conoscevo questa cosa. Bene... se ne impara sempre una di nuova.
Grazie per le precisazioni.

Ciao.