2010-01-15 13 views
6
  • È bitfield un concetto C o C++?Domande su C bitfields

  • Può essere utilizzato solo all'interno di una struttura? Quali sono gli altri posti in cui possiamo usarli?

  • AFAIK, i bitfield sono variabili di struttura speciali che occupano la memoria solo per il numero specificato. di bit. È utile per risparmiare memoria e nient'altro. Sono corretto?

ho codificato un piccolo programma per capire l'utilizzo di campi di bit - Ma, penso che non funziona come previsto. Mi aspetto che la dimensione della struttura sottostante sia 1 + 4 + 2 = 7 byte (considerando la dimensione di unsigned int è 4 byte sulla mia macchina), ma con mia sorpresa risulta essere 12 byte (4 + 4 + 4). Qualcuno può farmi sapere perché?

#include <stdio.h> 

struct s{ 
unsigned int a:1; 
unsigned int b; 
unsigned int c:2; 
}; 

int main() 
{ 
    printf("sizeof struct s = %d bytes \n",sizeof(struct s)); 
    return 0; 
} 

USCITA:

sizeof struct s = 12 bytes 

risposta

10

Perché a e c non sono contigui, ciascuno di loro si riservano il valore di un int pieno di spazio di memoria. Se si sposta a e c insieme, la dimensione della struttura diventa 8 byte.

Inoltre, si sta dicendo al compilatore che si desidera che a occupi solo 1 bit, non 1 byte. Quindi, anche se a e c l'uno accanto all'altro dovrebbero occupare solo 3 bit totali (sempre sotto un singolo byte), la combinazione di a e c diventa ancora allineata in memoria sulla macchina a 32 bit, quindi occupa un intero 4 byte oltre all'int b.

Allo stesso modo, si dovrebbe trovare che

struct s{ 
unsigned int b; 
short s1; 
short s2; 
}; 

occupa 8 byte, mentre

struct s{ 
short s1; 
unsigned int b; 
short s2; 
}; 

occupa 12 byte perché in quest'ultimo caso, i due corti ciascuno siedono nel loro allineamento a 32 bit .

6

1) Hanno origine in C, ma sono anche parte del C++, sfortunatamente.

2) Sì, o all'interno di una classe in C++.

3) Oltre a risparmiare memoria, possono essere utilizzati per alcune forme di bit twiddling. Tuttavia, sia la memoria che il twiddling sono intrinsecamente dipendenti dall'implementazione - se si desidera scrivere software portatile, evitare i campi bit.

+0

Al downgoter - quale di queste affermazioni non sei d'accordo? –

+0

+1: 'implementazione dependent' e 'avoid bitfields' sono la chiave. –

+0

Qui parzialmente non sono d'accordo riguardo ai risparmi di memoria: sentiti libero di specificare i campi di bit in cui potrebbero ridurre l'impronta di memoria di una struttura. Ma non cercare mai di essere intelligente con loro e sette volte non contare mai su ciò che il compilatore farà con loro. – dmckee

0

sua C.

tuo comiler ha arrotondato l'allocazione di memoria di 12 byte per scopi di allineamento. La maggior parte dei syubsystem di memoria del computer non è in grado di gestire l'indirizzamento dei byte.

+0

intendi "bit addressing", giusto? – SoapBox

0

Il tuo programma funziona esattamente come mi aspetterei. Il compilatore alloca bitfield adiacenti nella stessa parola di memoria, ma i tuoi sono separati da un non-bitfield.

Spostare i campi di bit uno accanto all'altro e probabilmente otterrete 8, che è la dimensione di due inte sulla macchina. I bitfield sarebbero racchiusi in un int. Questo è comunque specifico del compilatore.

I campi bit sono utili per risparmiare spazio, ma non molto altro.

0

I bitfield sono ampiamente utilizzati nel firmware per mappare diversi campi nei registri. Ciò consente di risparmiare molte operazioni manuali bit a bit che sarebbero state necessarie per leggere/scrivere campi senza di essa. Uno svantaggio è che non si può prendere l'indirizzo di bitfield.