2010-07-06 8 views
36

Mögliche Duplizieren:
What does ‘unsigned temp:3’ meansIn C, was bedeutet ein Doppelpunkt in einer Deklaration?

ich einige Kernel-Code zu lernen, und kam der folgenden Zeile (in Linux 2.4, sched.h, struct mm_struct):

unsigned dumpable:1; 

Was bedeutet das?

+0

Trinär ist Basis drei. Du meintest Ternär, und obwohl es der einzige ternäre Operator ist, wie John sagt, dass das nicht sein Name ist. –

+0

Danke, ich schätze diese Korrekturen. Ich habe diese Zeile aus meiner Frage entfernt, da sie nicht relevant war. – Tzafrir

+4

Ich glaube, dass das Doppelpunkt-Tag auf dieser Frage bleiben sollte, da andere, wie ich, dieses Wort verwenden könnten, um herauszufinden, was das bedeutet, bevor sie fragen. – Tzafrir

Antwort

53

Es ist ein bitfield Mitglied. Ihr Code bedeutet dumpable belegt genau 1 Bit in der Struktur.

Bitfelder werden verwendet, wenn Sie Mitglieder in Bit-Ebene packen möchten. Dies kann die Speichergröße stark reduzieren, wenn in der Struktur viele Flags vorhanden sind. Zum Beispiel, wenn wir eine Struktur mit 4 Mitgliedern mit bekannten numerischen Einschränkungs

0 < a < 20 
    b in [0, 1] 
0 < c < 8 
0 < d < 100 

dann die struct könnte erklärt werden, wie

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 wie

angeordnet sein definieren

statt

struct Foo { 
    unsigned a; 
    unsigned b; 
    unsigned c; 
    unsigned d; 
}; 

, in dem viele Bits aufgrund der Wertebereich

# wasted space which is not used by the program 
# v          v 
          ddddddd         ccc 
------------------------------------ ------------------------------------ 
      uint32         uint32 


            b        aaaaa 
------------------------------------ ------------------------------------ 
      uint32         uint32 

so können Sie Platz von zusammen viele Mitglieder Verpackung sparen verschwendet.

Beachten Sie, dass der C-Standard nicht angibt, wie die Bitfelder in einer "adressierbaren Speichereinheit" angeordnet oder gepackt sind. Außerdem sind Bitfelder im Vergleich zum direkten Mitgliederzugriff langsamer.

+5

Danke für eine tolle Antwort! Es ist erwähnenswert, für den gelegentlichen Leser, dass die Implementierung dieser Bitfelder nicht nur maschinenabhängig ist, sondern auch kompilerabhängig, und Code, der Annahmen über die Position dieser Bits im Speicher verwendet, ist höchst unportabel. – Tzafrir

+1

Der C99-Standard definiert, dass Bitfelder nebeneinander platziert werden, wenn genug Platz vorhanden ist. Eine Implementierung kann jede adressierbare Speichereinheit zuweisen, die groß genug ist, um ein Bitfeld zu halten. Wenn genug Platz bleibt, wird ein Bitfeld, das unmittelbar einem anderen Bitfeld in einer Struktur folgt, in benachbarte Bits derselben Einheit gepackt. – waynix

5

Es bedeutet, es ist ein Bitfeld - d. H. Die Größe von Dumpable ist ein einzelnes Bit, und Sie können nur 0 oder 1 zuweisen. Wird normalerweise in altem Code verwendet, um Speicherplatz zu sparen, oder in Low-Level-Code, der mit Hardware verbunden ist (obwohl die Verpackung nicht portabel ist). Weitere Informationen finden Sie unter

+0

Die Verpackung ist nicht unbedingt so wie es scheint, wie Sie richtig angeben. Oft sind die Bitfelder an 4-Byte-Grenzen ausgerichtet. Es gibt jedoch Compiler-Optionen, die dies beeinflussen. – GorillaPatch

3

Wenn ich mich richtig erinnere, bedeutet die Zahl nach dem Doppelpunkt, wenn sie innerhalb einer Struktur verwendet wird, wie viele Bits die Variable (oder ein Bitfeld) bilden.

Also unsigned dumpable:1; ist ein einzelnes Bit-Bitfeld.