Moin,
Ja, ich weiß: In structs kann man Felder definieren, die kleiner als ein Byte sind und nicht einmal an Bytegrenzen beginnen bzw. enden müssen:
typedef struct
{ int status:3;
int command:3;
int count:12;
} CTRLWORD;Das ist mir vollkommen neu. Wie setzt der Compiler das denn um? Gehört es zum ANSI-C-Standard?
Soweit ich weiß, ja. Aber ich bin mir nicht sicher. Die Microsoft- und Borland-Compiler kennen das jedenfalls.
Ja, das ist ANSI-C
Wie er das umsetzt? Na, für die Speicherreservierung ist das ja kein Problem. Der Speicherbedarf wird dabei einfach auf den nächsten möglichen Bytewert (oder WORD, oder DWORD, je nach Architektur) aufgerundet. Und der Zugriff auf diese Felder wird im Quellcode genauso formuliert wie bei einer herkommlichen Struktur, nur dass z.B. command nur einen Wertebereich von 0..7 (oder -4..+3) hat.
Formuliere ich einen lesenden Zugriff auf ctrlword.command, dann codiert der Compiler einen BYTE/WORD/DWORD-Zugriff auf die gesamte Struktur mit einem anschließenden >>3 und &7.12+3+3 sind doch 18.
Hmm, jetzt wo du das so sagst... ;-)
Stimmt natürlich, dann ist das Konstrukt, das ich als Beispiel konstruiert habe, natürlich 18bit lang, und der Compiler wird es vermutlich auf 32bit aufrunden.
Wie der Compiler diese Daten ablegt, ist seine Sache. Insbesondere sollte man nicht durch das Addieren von Bytes meinen, die Größe einer Struktur zu kennen, da Strukturen (und auch die Daten innerhalb einer Struktur) gerne an Grenzen ausgerichtet werden, die für einen schnellen Zugriff günstig sind.
Bei die 16-Bit Prozessoren ist es oft effizienter Strukturen und auch Daten innerhalb einer Struktur an einer geraden Adresse beginnen zu lassen. Für die 32-Bitter gilt ähnliches für durch 4 teilbare Adressen. Entsprechendes gilt für andere Architekturen.
@Marcel: Nimm eine anständige Struktur und arbeite mit sizeof bzw. Pointerarithmetik bzw. dem []-Operator. Oder gleich C++ (mit new[] und delete[]), falls dies möglich ist.
Claus