Handbuch zur dynamischen Ablaufverfolgung in Solaris

Bit-Felder

D erlaubt auch die Definition von ganzzahligen Strukturkomponenten und Unionsalternativen mit beliebiger Anzahl Bits. Diese werden als Bit-Felder bezeichnet. Zur Deklaration eines Bit-Felds werden ein vorzeichenbehafteter oder vorzeichenloser Integer-Basistyp, ein Komponentenname und die dem Feld zuweisende Anzahl Bits angegeben:

struct s {
	int a : 1;
	int b : 3;
	int c : 12;
};

Die Breite des Bit-Felds ist eine ganzzahlige Konstante, die vom Komponentennamen durch einen angehängten Strichpunkt getrennt ist. Die Bit-Feldbreite muss positiv sein und ihre Bitanzahl darf die Breite des entsprechenden Integer-Basistyps nicht überschreiten. Bit-Felder mit einer Größe von über 64 Bit dürfen in D nicht deklariert werden. Bit-Felder in D bieten Kompatibilität mit der entsprechenden ANSI-C-Fähigkeit und Zugriff auf diese. In der Regel werden Bit-Felder zum Sparen von Speicherplatz eingesetzt oder dann, wenn das Strukturlayout mit dem Layout eines Hardwareregisters übereinstimmen muss.

Ein Bit-Feld ist ein Compiler-Konstrukt, mit dem sich die Anordnung einer Ganzzahl und einer Gruppe von Masken zum Extrahieren der Komponentenwerte automatisieren lässt. Dasselbe Ergebnis erhalten Sie, indem Sie die Masken einfach selbst definieren und den Operator & verwenden. Der C- und der D-Compiler versuchen stets, Bits so effizient wie möglich zusammenzupacken. Sie haben hierfür aber keine Vorgabe hinsichtlich der Reihenfolge oder Art und Weise. Deshalb ergeben identische Bit-Felder auf unterschiedlichen Compilern oder Architekturen nicht unbedingt dieselbe Bit-Anordnung. Wenn Sie ein stabiles Bit-Layout benötigen, sollten Sie die Bit-Masken selbst konstruieren und die Werte mit dem Operator & extrahieren.

Der Zugriff auf eine Komponente eines Bit-Felds erfolgt einfach durch die Angabe seines Namens in Kombination mit einem der Operatoren „.” oder ->, wie bei jeder anderen Strukturkomponente oder Unionsalternative. Das Bit-Feld wird automatisch auf den nächstgrößeren Integer-Typ zur Verwendung in einem beliebigen Ausdruck erweitert. Da der Speicherbereich für ein Bit-Feld nicht an einer Byte-Grenze ausgerichtet sein oder eine gerade Bytezahl als Größe aufweisen darf, können die Operatoren sizeof und offsetof nicht auf Komponenten eines Bit-Felds angewendet werden. Der D-Compiler verbietet außerdem das Abrufen der Adresse einer Bit-Feldkomponente mit dem Operator &.