2014-11-03 15 views
6

Fount Diese Anweisung Eine Null-Breite Bitfeld kann das nächste Feld verursachen auf den nächsten Behälter Grenze ausgerichtet werden, wo der Behälter die gleiche Größe wie die zugrunde liegenden Typ des Bitfeldes istVerschiedene Typen für Nulllängen-Bitfelder in c?

Um es in die Praxis umzusetzen Angenommen int ist 2 Bytes (16 Bits) und diese Abkürzung ist 1 Byte (8 Bits), um das Schreiben zu ersparen. Nehmen wir an, wir benutzen den gcc-Compiler (wäre schön, die Unterschiede zu clang zu erklären).

struct foo { 
    unsigned int a:5; 
    unsigned int :0; 
    unsigned int b:3; 
} 

In Erinnerung sieht aus wie

struct address 
    |    
    | 
    v 
    aaaaa000 00000000 bbb00000 00000000 

Frage 1: In meinem Verständnis kann es nicht aussehen wie aaaaa000 00000000 0..00bbb00000..., also bbb mit dem Behälter auszurichten hat direkt den aktuellen Container folgen. Ist das tatsächlich wahr?

Umzug auf, wenn ich angeben

struct bar { 
    unsigned short x:5; 
    unsigned int :0; 
    unsigned short y:7; 
} 

Wird es wie so sein?

struct address 
    | short stops here   short starts 
    |  |     | 
    v  v | this is uint | v    
    xxxxx000 00000000 00000000 yyyyyyy0 

Edit 1 Es wurde, dass kurz darauf hingewiesen, nicht weniger als 16 Byte sein kann. Das ist etwas neben dem Punkt in dieser Frage. Aber wenn seine für Sie wichtig können Sie short mit char ersetzen und int mit short

+0

Welcher Compiler? Bitfelder haben viele implementierungsspezifische Details. –

+0

@CarlNorum hat die Frage bearbeitet. – user10607

+0

Sogar die Bitfelder werden für die Ausrichtung während der Typumschaltungen aufgefüllt, so dass Ihre Stichprobe nicht stimmt. –

Antwort

1

aktualisieren, nach dem Lesen des Textes in context:

Das Ergebnis Ihrer Beispiel (korrigiert char verwenden):

struct bar { 
    unsigned char x:5; 
    unsigned int :0; 
    unsigned char y:7; 
} 

würde wie folgt aussehen (vorausgesetzt, 16-Bit-int):

char pad pad  int boundary 
    | | |  | 
    v v v  v  
    xxxxx000 00000000 yyyyyyy0 

(Ich ignoriere Endian).

Das Nulllängen-Bitfeld bewirkt, dass sich die Position zur nächsten int Grenze bewegt. Sie haben int als 16-Bit definiert, also ergibt 16 minus 5 11 Bit Padding.

Es tut nicht fügen Sie eine gesamte leere int. Das Beispiel auf der Seite, die Sie verknüpfen, demonstriert dies (aber unter Verwendung von 32-Bit-Ganzzahlen).

+0

Hier ist der Link für den Kontext http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=%2Fcom.ibm.vacpp6m.doc%2Flanguage%2Fref%2Fclrc03defbitf.htm – user10607

+0

Ich tat etwas mehr lesen und Ihre Antwort passt gut zum großen Bild. Vielen Dank! – user10607

-1

Zuerst, wenn das Schreiben Bit-Felder, es wird immer empfohlen, dass Sie Variablen deklarieren entweder auf- oder Größen von Datentypen verwendet absteigend. Auf diese Weise wählt der Compiler immer die höchste Datentypgröße aus und macht Stücke derselben Größe.

Das ist, was ich denke, wird sein.

struct address 
| short stops here   short starts 
| |     | 
v v| this is unit  | v    
xxxxx000 00000000 00000000 yyyyyyy0 
+5

Erstens glaube ich nicht, dass das eine gültige Empfehlung ist, es sei denn, Ihr einziges Ziel ist es, den Platz zu minimieren. Manchmal werden Bitfelder verwendet, um einem extern auferlegten Layout zu entsprechen. Zweitens glaube ich nicht, dass dies die Frage beantwortet. –

Verwandte Themen