Josef schrieb:
> Zum Thema Bitfields ... Wozu macht man sich so etwas?
Damit man in einem Byte alle 8 Bit benutzen kann, selbst dann wenn man 8
Werte hat, die nur 0 oder 1 sein können (also die klassischen Bits).
Schreibst du
1 | uint8_t haveError;
|
2 | uint8_t haveOverflow;
|
3 | uint8_t isRed;
|
4 | uint8_t isGreen;
|
5 | uint8_t isBlue;
|
6 | uint8_t frameError;
|
7 | uint8_t answerReceived;
|
8 | uint8_t clockwise;
|
dann verbrauchen all diese Ja/Nein Entscheidungen zusammen 8 Stück
uint8_t.
Schreibst du das als
1 | struct flags_t
|
2 | {
|
3 | uint8_t haveError : 1;
|
4 | uint8_t haveOverflow : 1;
|
5 | uint8_t isRed : 1;
|
6 | uint8_t isGreen : 1;
|
7 | uint8_t isBlue : 1;
|
8 | uint8_t frameError : 1;
|
9 | uint8_t answerReceived : 1;
|
10 | uint8_t clockwise : 1;
|
11 | } Flags;
|
dann verbrauchen dieselben Informationen nur einen uint8_t. Und es gibt
Fälle, da ist dir das wichtiger als der etwas erhöhte Aufwand beim
zugriff auf die Einzelteile.
(Unter der Annahme, dass ein uint8_t aus 8 Bit besteht, was wohl der
Regelfall sein wird)
> Wenn ich das richtig gelesen habe, kann man sich nicht sicher
> sein wie der compiler den Speicher anlegt.
Ganz so einfach ist das nicht.
Der Compiler muss das Zeugs schon zusammenpacken. Aber wie er die Bits
vergibt, das ist seine Sache.
> Damit weiß man auch nicht ob man Speicherplatz spart und von der
> Geschwindigkeit dürfte es somit auch schlechter sein
Wenn der COmpiler überhaupt nicht packen würde, warum soll das dann von
der Geschwindigkeit her schlechter sein?
> Kann man dann auch mit größeren Werten ein Bitfeld, also eine
> Variable mit der anderen Überschreiben?
Nein.
Definierst du einen Member eines Bitfields mit 3 Bit, dann passen da
auch nur Werte rein, die sich mit 3 Bit darstellen lassen. Du kannst da
nichts größeres zuweisen und du kriegst da auch nichts größeres raus.
> Wenn Var1 4 Bits hat und ich dort einen Wert größer 2^3 reinschreibe,
> zerschiesst er mir den nächsten?
Nein
> oder fängt genau dass, das System ab? Dann wird es ja auch immer
> langsam wenn man drauf zu greift.
Natürlich.
Eine alte Regel in der Informatik besagt "Time for Space".
Und das bedeutet, dass man sich oft Speicherplatz mit Laufzeit erkauft
bzw. umgekehrt Laufzeit holt indem man Speicher opfert. Irgendeinen Tod
muss man dann eben sterben. Niemand zwingt dich Bitfelder einzusetzen.
Wenn dir die Laufzeit wichtiger ist als 7 verschwendete Bytes UND
Zugriffe häufig vorkommen, dann wird man das eben nicht so benutzen.