Portabilität von Bitfeldern

8

Ich lese hier , dass Bitfelder nicht portierbar sind. Bedeutet das, dass der Code darunter Bitfelder definiert (Code aus hier ), der auf bestimmten Rechnern nicht kompiliert werden konnte?

Wenn ja, warum?

%Vor%     
teaLeef 17.08.2014, 02:04
quelle

3 Antworten

17

Bitfelder sind portierbar, in dem Sinne, dass sie Teil der C-Sprache sind, wie im Standard spezifiziert ( C11 Abschnitt 6.7.2.1). Jeder Compiler, der Code nicht erkennt, der Bitfelder verwendet, ist nicht standardkonform. Es gibt auch nichts wirklich fragwürdiges an Ihrem Beispiel, da es nur Bitfelder hat.

Was sie wahrscheinlich meinen, ist, dass die Felder selbst unvorhersehbar in Lage und Ordnung gepackt sein können (erlaubt durch den Standard, vorheriger Ref. Paragraph 11). Dies bedeutet, dass eine Struktur mit z.B. vier Bitfelder der Größe 4, 12, 13 und 3 nehmen nicht notwendigerweise 32 Bits ein und sie werden nicht notwendigerweise in dieser Reihenfolge innerhalb der Struktur angeordnet; der Compiler kann sie dort platzieren, wo es ihnen gefällt. Dies bedeutet, dass die Struktur nicht als eine tatsächliche komponentenweise Darstellung eines zugrunde liegenden binären Objekts behandelt werden kann.

Im Gegensatz dazu existieren Bitmasken, die manuell auf ganze Zahlen angewendet werden, genau dort, wo Sie sie platzieren. Wenn Sie Masken definieren, die die ersten 4 Bits, die zweiten 12 Bits usw. einer vorzeichenlosen Ganzzahl ausmaskieren, werden die "Felder" tatsächlich auf die Bits in der Reihenfolge und in der Position angewendet (vorausgesetzt, Sie kennen die Endianz trotzdem). Dies macht die Darstellung compilerunabhängig.

d. Sie sind tragbar, aber was sie tun, muss nicht unbedingt genau das sein, was eine Person, die tatsächlich einzelne Bits manipulieren will, brauchen könnte.

    
Leushenko 17.08.2014, 02:16
quelle
8

Bitfelder sind Standardsprachfunktionen. Sie werden in allen C-Compilern kompiliert. Sie sind in diesem Sinne übertragbar. Ihr Code ist wohlgeformt und wird auch in allen C-Compilern kompiliert.

Anweisungen wie "Bit-Felder sind nicht portierbar" bedeuten normalerweise, dass das physikalische Layout von Bit-Feldern im Speicher von Implementierung zu Implementierung (d. h. von einem Compiler zu einem anderen) unterschiedlich sein kann. Sie erhalten möglicherweise unterschiedliche Ausgaben von Ihrem Programm, wenn sie auf verschiedenen Implementierungen kompiliert werden. Aber der Unterschied im Programmverhalten kann nur auftreten, wenn (und wann) Ihr Code vom Speicherlayout von Objekten mit Bitfeldern abhängt (z. B. wenn Sie ihre Größe wie in Ihrem Programm messen).

Mit anderen Worten, zu sagen, dass "Bit-Felder nicht portierbar" sind, ist ziemlich genau dasselbe wie zu sagen, dass der Typ int "nicht portierbar" ist, nur weil er unterschiedliche Größe auf verschiedenen Plattformen haben kann Endianness in seiner inneren Darstellung.

    
AnT 17.08.2014 02:15
quelle
3

Ein int muss mindestens 16 Bit in C sein. Wenn Sie also Bit-Felder in maximal portablem Code verwenden wollen, können Sie kein Bit-Feld haben, das mehr als 16 Bit belegt.

>

C.11 §6.7.2.1¶5:

  

Ein Bitfeld sollte einen Typ haben, der eine qualifizierte oder nicht qualifizierte Version von _Bool , signed int , unsigned int oder ein anderer implementierbarer Typ ist.

C.11 §5.4.2.1¶1:

  

- Maximalwert für ein Objekt vom Typ int
INT_MAX +32767 // 2 15 - 1
  - Maximalwert für ein Objekt vom Typ unsigned int
UINT_MAX 65535 // 2 16 - 1

    
jxh 17.08.2014 02:30
quelle

Tags und Links