2009-05-05 29 views
16

Se ho una struct C++, la definizione di una parola di dati a 64 bit, come ..Cosa C++ sintassi struct "a: b" significa

struct SMyDataWord 
{ 
    int Name : 40; 
    int Colour : 24; 
}; 

Che cosa significa la sintassi : 40 ... Vuol dire che i primi 40 bit sono riservati per il nome e i restanti 24 bit per il colore?

Questo è il modo in cui sembra essere utilizzato, ma non ho mai incontrato prima.

risposta

16

I bitfield, trasferiti da C. Name è largo 40 bit, Colour è largo 24 bit. La tua struct ha quindi almeno 64 bit. Sul mio sistema 64 bit sarebbero 8 byte.

+6

Su quale sistema sarebbero 64 bit non 8 byte? –

+10

Per essere pedante, il numero di bit in un byte dipende dall'implementazione (vedere uno degli standard C, C++). Questo è dato dalla macro CHAR_BIT nell'intestazione 'limits'. – dirkgently

+1

Alcuni mainframe IBM hanno avuto byte 9bit, IIRC. –

7

Sì, questa è la sintassi per bitfields. Sono comunemente usati per definire le strutture che si associano ai registri hardware. Ci sono alcune cose da tenere a mente se si decide di usarle, una è che non si può sapere come il compilatore fa il layout, l'ordine e il padding nei byte effettivi che compongono i campi possono e differiranno tra i compilatori (e forse con lo stesso compilatore ma con diverse impostazioni di ottimizzazione, anche).

+0

Nel collegamento MSDN che hai offerto, c'è una riga: * Nota che nYear ha una lunghezza di 8 bit e supererebbe il limite della parola del tipo dichiarato, int unsigned.Pertanto, è iniziato all'inizio di un nuovo int unsigned. * È una spiegazione errata secondo la figura sopra di esso? – zhangxaochen

6

Questa è una definizione bitfield.

Nome è un numero intero che è in grado di memorizzare esattamente 40 bit di informazioni. Il colore può memorizzare 24 bit.

Questo è spesso fatto per risparmiare spazio nelle strutture spesso necessarie, o comprimere il codice fino a una dimensione che è facile da gestire per la CPU (nel tuo caso 64 bit. Adatta esattamente in un registro CPU su una macchina a 64 bit) .

Il codice che accede ai bitfield verrà eseguito un po 'più lentamente.

3

Use them judiciously:

Ricordate che quasi tutto ciò che riguarda campi di bit è l'attuazione dipendente. Ad esempio, se i bit vengono memorizzati da sinistra a destra o da destra a sinistra, dipende dall'architettura hardware effettiva . Inoltre, ogni compilatore utilizza un diverso membro modello di allineamento, che è il motivo per cui la dimensione del BillingRec ottimizzato è di 12 byte anziché 9. Non è possibile prendere l'indirizzo di un campo po né è possibile creare un array di bit. Infine, nella maggior parte delle implementazioni di l'uso dei campi di bit comporta un sovraccarico di velocità. Pertanto, quando si ottimizza il codice , misurare l'effetto di una determinata ottimizzazione e i suoi compromessi prima di decidere di utilizzare esso.

Problemi correlati