Was bedeutet in C ein Doppelpunkt innerhalb einer Deklaration? [duplicate]

Lesezeit: 3 Minuten

Benutzeravatar von Tzafrir
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?

  • 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


Benutzeravatar von kennytm
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

Benutzeravatar von Justin Niessner
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.

1405000cookie-checkWas bedeutet in C ein Doppelpunkt innerhalb einer Deklaration? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy