Bit-Felder sind nicht portierbar im gleichen Sinne wie Integer nicht tragbar sind. Sie können Ganzzahlen verwenden, um ein tragbares Programm zu schreiben, aber Sie können nicht erwarten, eine binäre Darstellung von int
wie auf einem Remote-Computer zu senden und erwarten, dass es die Daten richtig interpretiert.
Dies liegt daran, dass 1. Wortlängen von Prozessoren unterscheiden, und deshalb die Größen von Integer-Typen unterscheiden (1,1 Byte Länge kann auch abweichen, aber das ist heutzutage selten außerhalb eingebetteter Systeme). Und weil 2. die Byte-Endianess über die Prozessoren hinweg unterschiedlich ist.
Diese Probleme sind leicht zu überwinden. Native Endiannität kann leicht in die vereinbarte Endianz umgewandelt werden (Big Endian ist de facto Standard für die Netzwerkkommunikation), und die Größe kann zur Kompilierzeit inspiziert werden, und Integer-Typen fester Länge sind heutzutage verfügbar. Daher können ganze Zahlen verwendet werden, um über das Netzwerk hinweg zu kommunizieren, solange diese Details beachtet werden.
Bitfelder, die auf regulären Integer-Typen aufbauen, haben also dieselben Probleme mit der Endian- und Integer-Größe. Aber sie haben even more Implementierung spezifiziertes Verhalten.
Alles über die tatsächliche Zuteilung Details von Bitfeldern innerhalb der Klasse Objekt
- Zum Beispiel auf einigen Plattformen Bitfelder Bytes nicht überspannen, auf andere sie tun
- Auf einigen Plattformen sind Bitfelder auch von links nach rechts gepackt, andere von rechts nach links.
Ob cha r, short, int, long und long long Bitfelder, die nicht explizit signiert oder vorzeichenlos sind, sind signiert oder unsigniert.
Im Gegensatz zu endianness ist es nicht trivial „alles über die tatsächliche Zuteilung“ oder auf eine kanonische Form zu konvertieren.
Auch während Endianness CPU-Architektur ist, sind die Bitfelddetails spezifisch für den Compilerimplementierer. Bit-Felder sind also nicht für die Kommunikation zwischen verschiedenen Prozessen innerhalb desselben Computers übertragbar, es sei denn, wir können garantieren, dass sie mit demselben (Version von) Compiler kompiliert wurden.
TL, DR-Bitfelder sind keine portable Möglichkeit, zwischen Computern zu kommunizieren. Ganzzahlen sind es auch nicht, aber ihre Nicht-Portabilität ist einfach zu umgehen.
In welchem Kontext wurden sie "unsicher" genannt? Einen Link hinzufügen? – anatolyg
Ich denke, es ist hauptsächlich, wie Leute Bitfields missbrauchen, um Teile anderer Datentypen-Repräsentationen auf Sub-Byte-Ebenen zu extrahieren, was komplett nicht portabel ist. – user2357112
@anatolyg [Lundins Kommentar] (http://stackoverflow.com/questions/35934375/bitfields-in-c-programming-language/35935493#comment59526628_35934375) auf [diese Frage] (http://stackoverflow.com/questions/ 35934375/bitfields-in-c-Programmiersprache/35935493). Zugegeben, ich habe nicht gesehen, dass sie genauso beschuldigt werden, "unsicher" zu sein, wie ich "nicht tragbar" habe, aber trotzdem. – Pharap