Frage zu einem bitweise Struct
-
Hallo Ich habe hier ein
struct mit 16 bit und es braucht 3 byte Speicherplatz warum ?
Initialisiere ich das gleiche sruct mit 16 Einträgen mit 1 bit ist es richtig mit 2 byte Speicher bei diesem struct nimmt sich src einbit in der nächsten Speicherzelle. Kann mir jemand sagen wo mein Denkfehler liegt ?struct frc{ unsigned frt:3; unsigned sec:1; unsigned frp:1; unsigned ack:1; unsigned pan:1; unsigned re1:3; unsigned des:2; unsigned re2:2; unsigned src:2; } FRC;
-
§9.6.1 schrieb:
[...] Allocation of bit-fields within a class object is implementation-defined. Alignment of bit-fields is implementation-defined. Bit-fields are packed into some addressable allocation unit. [...]
-
Von oben nach unten in Bytes gepackt, würde 're1' gerade auf einer Grenze liegen, so daß dieses dann wahrscheinlich vom Compiler in ein Byte gepackt wird. Und dasselbe dann auch für 'src'...
Durch Umsortierung könntest du es auf 2 Byte packen können (wenn die Summe dann immer 8 beträgt).
-
Danke für die Antwort
Nur Dummerweise
dachte ich könnte
http://www.rfwireless-world.com/Tutorials/Zigbee-MAC-layer-frame-format.html
ein IEEE 15.4 Frame Control Field nachbilden.
OK mal shen wie ich das mache nochmal Danke
-
Was ist denn bei dir
sizeof(unsigned)
?Bei einem gcc (win32 Projekt) kommt 4 raus. wenn ich
unsigned short
nehme, kommt 2 raus, beichar
ist es 3.Welchen Compiler für welches System nutzt du?
-
Hallo nochmal,
wenn re1 und re2 sowieso reservierte Felder sind (also bisher unbenutzt), dann nimm doch einfach:
struct frc { unsigned frt:3; unsigned sec:1; unsigned frp:1; unsigned ack:1; unsigned pan:1; unsigned re1_1:1; // hier die Bytegrenze unsigned re1_2:2; unsigned des:2; unsigned re2:2; unsigned src:2; } FRC;
PS: @DirkB: die Größe von unsigned (in Bytes) sollte doch gar keine Rolle hier bei Bitfeldern spielen
Du meinst, daß dann der Compiler intern bei "unsigned" ("unsigned int") auch für die Strukturgröße dieses dann benutzt?Edit:
OK, habe ich jetzt mal selber auch bei Ideone überprüft: Code - kriege auch die selben Werte raus: 4, 2 oder 3.Also sollte man wohl immer "unsigned char" bei Bitfeldern nutzen. Klappt aber auch nur, solange die Bitanzahl einzelner Felder nicht größer als 7 ist (sonst kommt: "error: exceeds size of type").
Scheint für mich aber eine Spezialität vom gcc zu sein - habe dies bisher bei anderen Compilern nicht so festgestellt...
-
Th69 schrieb:
Also sollte man wohl immer "unsigned char" bei Bitfeldern nutzen.
Nö, man sollte einfach Bitfelder niemals nutzen...
-
Th69 schrieb:
Also sollte man wohl immer "unsigned char" bei Bitfeldern nutzen.
Nein. Dann hast du ja das Problem vom TO.
Bei
unsigned short
(uint16_t) passt es ja.(Da es um Zigbee geht, kann es sich auch um einen Compiler für einen 8-Bit-Mikrocontroller handeln.)
-
Ich meinte "unsigned char", um die Größe generell so klein wie möglich zu halten, denn bei "unsigned short" würde dann ja auch immer mindestens 2 Byte reserviert - auch wenn man nur ein kleines Bitfeld hat:
struct Test { unsigned char first:3; unsigned char second:1; }
Hier will man ja nur 1 Byte (und nicht 2 Byte) für die gesamte Datenstruktur haben: Code (und bei "unsigned short" kommt aber 2 heraus!)