2 Bit in ein Struct schmuggeln?
-
hi,
ich habe ein struct in welchem ich zusätzlich zu den zwei komponenten 2 bits ablegen möchte, welche mögl. hab ich?
struct{ size_t a; char *b; }
danke!
-
könnte evtl. jmd. aus dem bin im titel ein bit machen
-
Hast du so arge Platzprobleme? Da musst du dich schon in die Tiefen von compilerspezifischen Sachen vortasten. Stichwort: Alignment?
Das sollte bis zum Byte hinunter funktionieren. Ob das da noch eine Möglichkeit fürs Bit gibt?
Unter welches Betriebssystem oder Compiler willst du da dran?
MfG f.-th.
-
also es geht darum:
b zeigt auf einen dynamischen oder statischen speicherbereich. beim freigeben des structs muss ich wissen, ob ich b separat freigeben muss. da ich noch ein paar andere sonderfälle hab, bräucht ich eben iwo 2 bits. wenn ich es nicht schön unterbekomm, muss ich mir das beim programmieren merken, so dass keine memleaks entstehen. da ich aber vergesslich bin wär es viel einfacher, wenn ich einfach immer struct_free(*s) aufrufen könnte, ohne mir zu merken ob b nun auf statischen bzw. dynamischen speicher zeigt.
hoffe es ist klar geworden, was ich mir gedacht hab... das struct von 8 auf 12 byte aufzublasen wär es mir nicht wert!
btw. es läuft auf einem x86 32bit linux und wird mit gcc compiliert.
-
Wenn Du alle Verwendungsstellen der struct unter Kontrolle hast, könntest Du höchstens die obersten Bits der size_t nutzen, was dann aber dazu führt, dass Deine size_t nur noch bis 2^30 geht. (im 32Bit Fall)
für 32Bit:
Mit flag1 = 0x80000000 und flag2 = 0x40000000 und mask = 0x3fffffff kannst
du die Bits setzen und löschen (sz |= flag bzw sz &= ~flag) und mit (sz & mask) die size auslesen. Zum Setzen der size kann man dann
size = newsize | (size & (flag1|flag2)); verwenden.Für 64Bit sehen flag1, flag2 und mask entsprechend anders aus (0x8000000000000000, ...)
Aber schön ist sowas nicht und man muss dann schon genau wissen was man tut. Ich würde auf jeden Fall setter und getter Funktionen schreiben, die Wertebereiche überprüfen und die Bitoperationen sauber verpacken.
Für Deinen Fall scheint mir das aber eigentlich nicht wirklich notwendig zu sein. Überlege lieber, ob Du das nicht auch anders lösen kannst.
-
king_george² schrieb:
hi,
ich habe ein struct in welchem ich zusätzlich zu den zwei komponenten 2 bits ablegen möchte, welche mögl. hab ich?
struct{ size_t a; char *b; }
danke!
struct { size_t a; char *b; char bit1 : 1; char bit2 : 1; };
-
also ich hab die bits jetzt raus gelassen. dibadas vorschlag, die obersten Bits der size_t zu nutzen hätt mir am besten gefallen. alternativ in den pointer der structs... aber das wär schon arg verwurstelt