Mögliches Duplikat:
Was bedeutet „unsigned temp:3“?
Ich lerne etwas Kernel-Code und kam auf die folgende Zeile (in Linux 2.4, sched.h, struct mm_struct):
unsigned dumpable:1;
Was bedeutet das?
Tzafrir
Mögliches Duplikat:
Was bedeutet „unsigned temp:3“?
Ich lerne etwas Kernel-Code und kam auf die folgende Zeile (in Linux 2.4, sched.h, struct mm_struct):
unsigned dumpable:1;
Was bedeutet das?
kennytm
Es ist ein Bitfeld Mitglied. Ihr Code bedeutet dumpable
belegt genau 1 Bit in der Struktur.
Bitfelder werden verwendet, wenn Sie Mitglieder auf Bitebene packen möchten. Dies kann die Größe des verwendeten Speichers erheblich reduzieren, wenn viele Flags in der Struktur vorhanden sind. Zum Beispiel, wenn wir eine Struktur mit 4 Mitgliedern mit bekannter numerischer Einschränkung definieren
0 < a < 20
b in [0, 1]
0 < c < 8
0 < d < 100
dann könnte die Struktur als deklariert werden
struct Foo {
unsigned a : 5; // 20 < 2^5 = 32
unsigned b : 1; //
unsigned c : 3; //
unsigned d : 7; // 100 < 2^7 = 128
};
dann die Bits von Foo kann angeordnet sein wie
ddddddd c cc b aaaaa
--------- --------- --------- ----------
octet 1 octet 0
===========================================
uint32
Anstatt von
struct Foo {
unsigned a;
unsigned b;
unsigned c;
unsigned d;
};
bei dem aufgrund des Wertebereichs viele Bits verschwendet werden
# wasted space which is not used by the program
# v v
ddddddd ccc
------------------------------------ ------------------------------------
uint32 uint32
b aaaaa
------------------------------------ ------------------------------------
uint32 uint32
So können Sie Platz sparen, indem Sie viele Mitglieder zusammenpacken.
Beachten Sie, dass der C-Standard nicht spezifiziert, wie die Bitfelder innerhalb einer “adressierbaren Speichereinheit” angeordnet oder gepackt sind. Außerdem sind Bitfelder im Vergleich zum direkten Member-Zugriff langsamer.
Danke für eine tolle Antwort! Für den gelegentlichen Leser sollte ausdrücklich darauf hingewiesen werden, dass die Implementierung dieser Bitfelder nicht nur maschinenabhängig, sondern auch vom Compiler abhängig ist und Code, der Annahmen über die Position dieser Bits im Speicher verwendet, höchst unportabel ist.
– Tzafrir
6. Juli 2010 um 12:49 Uhr
Der C99-Standard definiert, dass Bitfelder nebeneinander platziert werden, wenn genügend Platz vorhanden ist. “Eine Implementierung kann jede adressierbare Speichereinheit zuweisen, die groß genug ist, um ein Bitfeld zu halten. Wenn genügend Platz verbleibt, muss ein Bitfeld, das in einer Struktur unmittelbar auf ein anderes Bitfeld folgt, in benachbarte Bits derselben Einheit gepackt werden.”
– Wegnix
8. April 2013 um 12:27 Uhr
Es bedeutet, dass es sich um ein Bitfeld handelt – dh die Größe von Dumpable ist ein einzelnes Bit, und Sie können ihm nur 0 oder 1 zuweisen. Wird normalerweise in altem Code verwendet, um Platz zu sparen, oder in Low-Level-Code, der mit Hardware verbunden ist (auch wenn die Verpackung nicht portabel ist). Sehen hier für mehr Informationen
Die Verpackung ist nicht unbedingt so, wie es scheint, wie Sie richtig darauf hinweisen. Häufig sind die Bitfelder an 4-Byte-Grenzen ausgerichtet. Es gibt jedoch Compiler-Optionen, die dies beeinflussen.
– GorillaPatch
6. Juli 2010 um 12:24 Uhr
Justin Nießner
Wenn ich mich richtig erinnere, bedeutet die Zahl nach dem Doppelpunkt, wenn sie innerhalb einer Struktur verwendet wird, aus wie vielen Bits die Variable (oder ein Bitfeld) besteht.
So unsigned dumpable:1;
ist ein Einzelbit-Bitfeld.
Trinär ist die Basis drei. Sie meinten ternär, und obwohl es der einzige ternäre Operator ist, ist das nicht sein Name, wie John sagt.
– Peter Kirkham
6. Juli 2010 um 12:13 Uhr
Danke, ich weiß diese Korrekturen zu schätzen. Ich habe diese Zeile aus meiner Frage ganz entfernt, da sie nicht relevant war.
– Tzafrir
6. Juli 2010 um 12:21 Uhr
Ich glaube, dass der Doppelpunkt bei dieser Frage bleiben sollte, da andere wie ich dieses Wort verwenden könnten, um herauszufinden, was dies bedeutet, bevor sie fragen.
– Tzafrir
6. Juli 2010 um 12:23 Uhr