2009-03-10 4 views
5

Sono curioso di sapere perché i campi di bit con lo stesso tipo di dati richiedono meno dimensioni rispetto ai tipi di dati misti .perché i campi di bit per gli stessi tipi di dati hanno dimensioni inferiori rispetto ai campi di bit per i tipi di dati mix

struct xyz 
{ 
    int x : 1; 
    int y : 1; 
    int z : 1; 
}; 


struct abc 
{ 
    char x : 1; 
    int y : 1; 
    bool z : 1; 
}; 

sizeof (xyz) = 4 sizeof (abc) = 12.

Sto usando VS 2005, computer a 64 bit x86.

Una risposta a livello di macchina/compilatore di bit sarebbe ottima.

risposta

4

Allineamento.

Il compilatore allineerà le variabili in un modo che ha senso per la tua architettura. Nel tuo caso, char, int e bool sono di dimensioni diverse, quindi andrà da quelle informazioni piuttosto che dai tuoi suggerimenti sul campo dei bit.

C'è stata qualche discussione in this question sull'argomento.

La soluzione è fornire le direttive #pragma o __attributes__ al compilatore per indicare che ignora le ottimizzazioni di allineamento.

+1

Nota che i campi di bit in realtà non hanno i requisiti di allineamento. –

+0

No, ma il compilatore non ha l'obbligo di comprimerli. – greyfade

+0

Vedere ISO14882: 2003, §9.6, paragrafo 1. – greyfade

3

Lo standard C (versione del 1999, §6.7.2.1, pagina 102, punto 10) dice questo:

L'attuazione può assegnare qualsiasi unità di memorizzazione indirizzabile abbastanza grande da contenere un campo di bit . Se rimane abbastanza spazio, un campo di bit che segue immediatamente un altro campo di bit in una struttura deve essere impacchettato in bit adiacenti della stessa unità.

Non sembra esserci alcuna formulazione per consentire che l'imballaggio sia influenzato dai tipi di campi. Quindi concluderei che questo è un bug del compilatore.

gcc crea una struttura a 4 byte in entrambi i casi, su una macchina a 32 bit ea 64 bit, sotto Linux. Non ho VS e non posso testarlo.

+1

C++ 03, §9.6, paragrafo 1, afferma: "L'allocazione di campi di bit all'interno di un oggetto di classe è definita dall'implementazione L'allineamento di campi di bit è definito dall'implementazione.I campi di bit sono raggruppati in alcune unità di allocazione indirizzabili." Sembra che Mahesh stia usando un compilatore C++. – greyfade

+0

D'altra parte, ha anche taggato questo come una domanda in C, non solo in C++. Immagino che la risposta sia diversa per C e C++. –

+0

Sarei cauto nel sostenere questo come un "bug" dato che stavi citando lo standard ISO C99. MSVC++ non rivendica l'aderenza a C99. Supporta ISO C90/ANSI C89. – Clifford

0

È un bug del compilatore o un errore di codice. Tutti i bit assegnati nella struttura cercano sempre di definire le dimensioni del tipo di dati più elevato. ad es. In struct xyz sizeof il più alto tipo di dati è 4 cioè di int. Analogamente per la seconda struttura abc la dimensione massima del tipo di dati è 4 per int.

Dove se cambiamo le variabili di struttura come segue: struct abc { char a: 1; char b: 1; bool c: 1; };

sizeof (abc) sarebbe 1 non 4. Poiché il tipo di dati più alto di dimensione è 1 e tutti i bit si adattano a 1 byte di carattere.

vari test possono essere eseguiti modificando il tipo di dati nella struttura.

link per l'output sulla base di vecchia struttura: Visita http://codepad.org/6j5z2CEX

link per l'output in base alla struttura sopra definita da me: Visita http://codepad.org/fqF9Ob8W

Per evitare tali problemi per le strutture sizeof saremo imballare correttamente le strutture mediante #pragma pack macro.