2013-01-07 10 views
7
#include <stdint.h> 
#include <stdio.h> 

typedef union { 
    uint64_t u[2]; 
    struct { 
     uint64_t a:30; 
     uint64_t b:30; 
     uint64_t c:30; 
     uint64_t d:30; 
     uint64_t e:8; 
    }x; 
} mystruct; 

int main() 
{ 
    printf("Size %d\n", sizeof(mystruct)); 
} 

Sto provando a compilarlo su una macchina a 64 bit. L'uscita prevista era 16 ma ottengo 24. So che qualche allineamento è successo qui ma non sono sicuro del perché la struct x è esattamente 16 byte. Qualcuno può spiegarlo. Graziesizeof non mostra l'output previsto

+2

Si utilizza campi di bit: K & R Pagina 150: *" Quasi tutto ciò che riguarda i bitfield dipende dall'implementazione "*. Personalmente avrei omesso il "Quasi". – cdarke

+2

@cdark dicono * quasi * perché il resto non è specificato;) – ouah

risposta

6

Dalla C standard:

(C99, 6.7.2.1p10) "[...] Se lo spazio insufficiente rimane, se un campo di bit che non si adatta è messo in l'unità successiva o si sovrappone alle unità adiacenti è definita dall'implementazione . "

Quindi nel tuo implementazione che non si sovrappongono: a e b membri sono in una sola unità, c e d sono in un altro un'unità e e è in un'altra unità: 8 + 8 + 8 = 24.

6

Per una macchina a 64 bit, campi a e b uso 60 bit del primo valore a 64 bit nella struct, c e d uso 60 bit del successivo valore a 64 bit nel struct, e poi perché e è 8 bit che non può essere inserito nei 4 bit rimasti da quel valore a 64 bit, quindi è necessario un altro valore a 64 bit. Quindi 8x3 = 24 byte.

3

Un elemento di un campo di bit non si sovrapporrà mai a due "unità" di memoria (nel tuo caso l'unità di memoria è un elemento a 64 bit).

Oltre al fatto che bitfield implementazione sono compilatore dipendente, c'è tutte le possibilità che la struttura bitfield è in realtà conservato il modo seguente in memoria:

struct { 
    uint64_t a:30; 
    uint64_t b:30; 
    uint64_t :4; 
    uint64_t c:30; 
    uint64_t d:30; 
    uint64_t :4; 
    uint64_t e:8; 
    uint64_t :56; 
}x;