Was bedeutet ein unbenanntes Bitfeld der Länge Null in C? [duplicate]

Lesezeit: 5 Minuten

Benutzeravatar von msc
msc

Ich habe das folgende Beispiel im C-Standardentwurf gesehen (n1570):

$3.14 Absatz 4 : Eine Struktur deklariert als:

struct 
{
        char a;
        int b:5, c:11, :0, d:8;
        struct 
        { 
            int ee:8; 
        } e;
}

Damit, Was macht :0 bedeuten?

Ich weiß, was ein Bitfeld ist, aber :0 ist ohne Namen, was ich nicht verstehe.

Was ist der Zweck von :0 ohne Kennung?

  • Nebenbemerkung: Wenn die Platzierung von Bits innerhalb von Bitfeldern wichtig ist, sollten Sie Bitfelder wahrscheinlich gar nicht erst verwenden.

    – Benutzer694733

    28. August 2017 um 10:47 Uhr

  • Ich bin mir nicht ganz sicher …. ist der markierte Dupe angemessen? Diese besondere Verwendung wird in den Antworten nicht hervorgehoben.

    – Sourav Ghosh

    28. August 2017 um 10:54 Uhr

  • Ich habe mir die Freiheit genommen, wieder zu öffnen, da der markierte Betrüger möglicherweise ist irreführend. Wenn jemand einen anderen Betrüger hat, tun Sie bitte die Ehre.

    – Sourav Ghosh

    28. August 2017 um 11:28 Uhr

  • @hackks sir, ich selbst habe diese Frage erneut geöffnet, da sie zuvor als Betrüger für dieselbe Frage markiert wurde. Stimmen Sie meiner Ansicht nicht zu?

    – Sourav Ghosh

    28. August 2017 um 15:25 Uhr

  • @hackks OK, das ist richtig, aber ich denke, diese Frage hatte einen anderen Aspekt mit dem spezifischen Zitat. Meiner Ansicht nach sind sie kein Dupe, sondern ergänzen sich, kein Vergehen, Sir.

    – Sourav Ghosh

    28. August 2017 um 15:30 Uhr


Benutzeravatar von Sami Kuhmonen
Sami Kuhmonen

Wie das von Ihnen verlinkte Dokument direkt zuvor erklärt:

Ein Bitfeld und ein benachbartes Nicht-Bitfeld-Element befinden sich an getrennten Speicherstellen. Dasselbe gilt für zwei Bitfelder, wenn eines innerhalb einer verschachtelten Strukturdeklaration deklariert ist und das andere nicht, oder wenn die beiden durch eine Bitfelddeklaration der Länge Null getrennt sindoder wenn sie durch eine Member-Deklaration getrennt sind, die kein Bitfeld ist

Es ist eine Möglichkeit, dem Compiler das mitzuteilen b und c kann / wird sich jedoch am selben Speicherort befinden d müssen von ihnen getrennt sein und können gleichzeitig geändert werden b/c

  • Angesichts der Tatsache, wie implementierungsabhängig Bitfelder sind, würde ich sagen, dass es keinen wirklichen Sinn gibt. Wenn Sie ein bestimmtes Bit-Layout benötigen, ist es meiner Meinung nach viel besser, die Bits einfach selbst zu maskieren.

    – Andreas Henle

    28. August 2017 um 10:46 Uhr

  • @AndrewHenle – kein wirklicher Punkt außer dem Multithread-Zugriff

    – Alex C

    28. August 2017 um 12:50 Uhr

Benutzeravatar von Sourav Ghosh
Sourav Ghosh

Sehen wir uns zunächst Kapitel §6.7.2.1 an, Struktur- und Unionsspezifizierer, P11. Es sagt,

Eine Implementierung kann jede adressierbare Speichereinheit zuweisen, die groß genug ist, um ein Bitfeld zu halten.
Wenn genügend Platz verbleibt, soll ein Bitfeld, das in einer Struktur unmittelbar auf ein anderes Bitfeld folgt, in benachbarte Bits derselben Einheit gepackt werden. […]

Aber für den Fall, dass wir ausdrücklich zwei aufeinanderfolgende Bitfeld-Mitglieder wollen, die in einen einzigen Speicherplatz gepackt „sein könnten“, um sich an einem separaten Speicherplatz (dh einer adressierbaren Speichereinheit) zu befinden, ist das obige der Weg dazu Gewalt es.

Der nächste Absatz, P12, erwähnt,

Eine Bitfeld-Deklaration ohne Deklarator, sondern nur mit einem Doppelpunkt und einer Breite, zeigt an
unbenanntes Bitfeld.126) Als Sonderfall zeigt ein Bitfeld-Strukturelement mit einer Breite von 0 dies an kein weiteres Bitfeld soll in die Einheit gepackt werden, in der das vorherige Bitfeld, falls vorhanden, platziert wurde.

Nach Ihrem Beispiel stellt dies sicher, dass die beiden Bitfeldmitglieder, die die umgeben :0 werden an separaten Speicherorten residieren (nicht innerhalb einer einzelnen adressierbaren Speichereinheit, selbst wenn noch genügend Speicherplatz vorhanden ist, um sie in eine zu packen). Dies hat den ähnlichen Effekt, dass ein Nicht-Bitfeld-Element zwischen zwei Bitfeldern vorhanden ist, um die Trennung der Speicherstelle zu erzwingen.

Zitieren C11Kapitel §3.14, NOTE 2 (Betonung von mir)

Ein Bitfeld und ein benachbartes Nicht-Bitfeld-Element befinden sich an getrennten Speicherstellen. Dasselbe gilt für zwei Bitfelderwenn eine innerhalb einer verschachtelten Strukturdeklaration deklariert ist und die andere nicht, oder wenn die beiden durch eine Bitfelddeklaration der Länge Null getrennt sind, oder wenn sie durch eine Nicht-Bitfeld-Member-Deklaration getrennt sind.

Auch in Bezug auf die Verwendung (“Warum es benötigt wird” Teil)

[…] Die Bitfelder b und c können nicht gleichzeitig geändert werden, aber b und akann zum Beispiel sein.


Nachtrag:

In Bezug auf den Parallelitätsteil, von ANMERKUNG 1

Zwei Ausführungs-Threads können getrennte Speicherorte aktualisieren und darauf zugreifen, ohne sich gegenseitig zu stören.

und ab Kapitel §5.1.2.4/P1,

Bei einer gehosteten Implementierung kann ein Programm mehr als einen Ausführungsthread (oder Thread) gleichzeitig ausführen. […]

Dies ist also eine theoretisch praktikable Option gemäß dem Standard.

  • Die Bitfelder b und c können nicht gleichzeitig geändert werden, aber b und akann zum Beispiel sein. Wo kommt das her? Die C-Sprache selbst hat kein Konzept der “Parallelität”, und Bitfelder sind stark implementierungsabhängig.

    – Andreas Henle

    28. August 2017 um 10:50 Uhr


  • @AndrewHenle Das ist ein Standardzitat. Ich dachte, ich wäre klar genug, um die Kapitel zu markieren. 🙂

    – Sourav Ghosh

    28. August 2017 um 10:51 Uhr

  • Ich habe eine Suche nach der C-Standardkopie unter durchgeführt open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf und das Ergebnis wurde nicht zurückgegeben. Seltsam. Interessanter Kommentar zum Threading im Standard dort.

    – Andreas Henle

    28. August 2017 um 10:55 Uhr


  • @AndrewHenle Ich sehe es dort (sogar über Ihren Link)…. Kapitel §3.14, ANMERKUNG 4. Haben Sie etwas gegen eine erneute Überprüfung?

    – Sourav Ghosh

    28. August 2017 um 10:56 Uhr


  • Ich habe es gefunden. Vielleicht stört der fettgedruckte Text im PDF die Suche im PDF-Viewer von Firefox? Laden Sie die Norm in den Acrobat Reader, und die Textsuche findet das Zitat problemlos.

    – Andreas Henle

    28. August 2017 um 10:59 Uhr

Benutzeravatar von paxdiablo
paxdiablo

Auf diese Weise wird sichergestellt, dass Bit-Dateien, die sonst zu a kombiniert werden könnten Single Speicherort, sind es nicht.

Angenommen, Sie haben ein 8-Bit-Zeichen, möchten aber sicherstellen, dass sich Ihre beiden 3-Bit-Felder an verschiedenen Stellen befinden (und daher gleichzeitig geändert werden können). Um das zu erreichen, könnten Sie Folgendes verwenden:

struct xyzzy {
    int first  : 3,
               : 0,
    int second : 3;
};

und Sie müssten sich keine Gedanken über das manuelle Ausfüllen des Leerzeichens machen, z. B. mit junk : 5.

Für die Sprachjuristen C11 3.14 memory location /3 heißt es (meine Betonung):

Ein Bitfeld und ein benachbartes Nicht-Bitfeld-Element befinden sich an getrennten Speicherstellen. Dasselbe gilt für zwei Bitfelder, wenn eines innerhalb einer verschachtelten Strukturdeklaration deklariert ist und das andere nicht, oder wenn die beiden durch eine Bitfelddeklaration der Länge Null getrennt sind, oder wenn sie durch eine Nicht-Bitfeld-Member-Deklaration getrennt sind.

1437320cookie-checkWas bedeutet ein unbenanntes Bitfeld der Länge Null in C? [duplicate]

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

Privacy policy