2010-01-15 20 views
6
  • Ist Bitfield ein C-Konzept oder C++?Fragen über C-Bitfelder

  • Kann es nur innerhalb einer Struktur verwendet werden? An welchen anderen Orten können wir sie benutzen?

  • AFAIK, Bitfelder sind spezielle Strukturvariablen, die den Speicher nur für die spezifizierte Nr. Belegen. von Bits. Es ist nützlich beim Speichern von Speicher und sonst nichts. Bin ich richtig?

codierte ich ein kleines Programm, um die Nutzung von bitfields zu verstehen - aber ich denke, es ist nicht wie erwartet funktioniert. Ich erwarte, dass die Größe der unteren Struktur 1 + 4 + 2 = 7 Bytes ist (wenn man die Größe von unsigned int berücksichtigt, sind 4 Bytes auf meinem Rechner), aber zu meiner Überraschung stellt es sich heraus, dass es 12 Bytes (4 + 4 + 4) ist). Kann mir jemand wissen warum?

#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; 
} 

OUTPUT:

sizeof struct s = 12 bytes 

Antwort

10

Da a und c sind nicht zusammenhängend, sie jeweils zu reservieren einen ganzen int im Wert von Speicherplatz. Wenn Sie a und c zusammen verschieben, wird die Größe der Struktur 8 Bytes.

Darüber hinaus sagen Sie dem Compiler, dass Sie a nur 1 Bit, nicht 1 Byte belegen möchten. Auch wenn a und c nebeneinander nur 3 Bits insgesamt belegen sollten (immer noch unter einem einzigen Byte), wird die Kombination aus a und c immer noch im Speicher auf Ihrer 32-Bit-Maschine wortorientiert und belegt somit volle 4 Bytes zusätzlich zu dem int b.

In ähnlicher Weise würden Sie feststellen, dass

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

8 Bytes belegt, während

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

12 Bytes, weil im letzteren Fall nimmt die beiden kurzen Hosen sitzen jeweils in ihrer eigenen 32-Bit-Ausrichtung .

6

1) Sie stammen aus C, sind aber leider auch Teil von C++.

2) Ja oder innerhalb einer Klasse in C++.

3) Sie können nicht nur Speicher sparen, sie können auch für einige Arten von Bit Twiddling verwendet werden. Speichereinsparung und Twiddling sind jedoch inhärent implementierungsabhängig - wenn Sie portable Software schreiben möchten, vermeiden Sie Bitfelder.

+0

Zum Downvoter - welcher dieser Aussagen stimmen Sie nicht zu? –

+0

+1: 'implementierungsabhängig' und 'Bitfelder vermeiden' sind der Schlüssel. –

+0

Ich stimme hier in Bezug auf Speichereinsparungen teilweise nicht überein: Fühlen Sie sich frei, Bitfelder anzugeben, wo sie den Speicherbedarf einer Struktur reduzieren könnten. Aber versuchen Sie nie, klug mit ihnen zu sein, und siebenmal zählen Sie nie darauf, was der Compiler mit ihnen machen wird. – dmckee

0

Seine C.

Ihre comiler hat zur Ausrichtung der Speicherzuweisung auf 12 Byte gerundet. Die meisten Computerspeicher-Sybubsysteme können die Byte-Adressierung nicht verarbeiten.

+0

du meinst "bit addressing", oder? – SoapBox

0

Ihr Programm funktioniert genau so, wie ich es erwarte. Der Compiler ordnet benachbarte Bitfelder demselben Speicherwort zu, aber Ihre sind durch ein Nicht-Bitfeld getrennt.

Verschieben Sie die Bitfelder nebeneinander und Sie erhalten wahrscheinlich 8, was der Größe von zwei Ints auf Ihrem Computer entspricht. Die Bitfelder würden in einen int gepackt werden. Dies ist jedoch compilerspezifisch.

Bitfelder sind nützlich, um Platz zu sparen, aber nicht viel mehr.

0

Bitfelder sind in der Firmware weit verbreitet, um verschiedene Felder in Registern abzubilden. Dies spart viele manuelle bitweise Operationen, die notwendig gewesen wären, um Felder ohne sie zu lesen/schreiben. Ein Nachteil ist, dass Sie Adresse von Bitfeldern nicht nehmen können.