I dati sono disposti e accessibili nella memoria del computer mediante l'allineamento della struttura dei dati. Che ha due questioni correlate
- allineamento
- Imbottitura
Quando un'operazione di scrittura viene eseguita da computer, scrive di solito in multiplo di 4 byte (per i sistemi a 32 bit). Una ragione per questo atto è l'obiettivo di aumentare le prestazioni.Pertanto, quando si scrive una struttura dati, che ha prima una variabile da 1 byte e quindi una variabile da 4 byte, eseguirà il riempimento dopo i primi 1 byte di dati per allinearla su limiti a 32 bit.
struct {
union {
struct {
uint32_t messageID : 26;
uint8_t priority : 3;
} __attribute__ ((packed));
uint32_t rawID : 29;
} __attribute__ ((packed));
uint8_t canFlags : 3;
} __attribute__ ((packed)) idSpecial;
Ora nella struttura dati sopra riportati si utilizza __attribute__ ((packed))
che significa senza imbottitura. Quindi uint32_t è di 4 byte, ma si sa che ha 26 bit e 3 bit per priorità. Ora, poiché avete entrambe le variabili in una struttura, riserverà 32 bit anziché 29 in modo che le informazioni della prima struttura siano allineate sui limiti.
Ora per canFlags Avrà bisogno di altri byte. Quindi questo rende 5 byte anziché 4.
fonte
2015-04-01 07:43:39
possibile duplicato di [Strutture e unioni in C, determinazione delle dimensioni e accesso ai membri] (http://stackoverflow.com/questions/3380118/structures-and-unions-in-c -determining-size-and-accessing-members) –
@DavidTitarenco: Non penso che quel particolare post sia valido per i bitfield. Non mi sorprenderebbe se questa risposta fosse stata da qualche altra parte. –
I risponditori devono notare che l'OP sta utilizzando l'estensione GCC non standard __attribute__ ((compressa))] (https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html) per evitare il riempimento . Quindi, dire che il compilatore può inserire padding in ogni caso non è corretto - quando viene usato '__attribute __ ((packed))', GCC organizzerà la struttura per evitare il padding (rendendo l'accesso più costoso su piattaforme che non supportano letture non allineate). – user4815162342