Ich habe eine Struktur von Bitfeldern, die sich zu 48 Bits addieren. Auf GCC führt dies korrekt zu einer 6-Byte-Struktur, aber in MSVC kommt die Struktur 8 Bytes heraus. Ich muss einen Weg finden, um MSVC zu zwingen, die Struktur richtig zu packen, sowohl für die Interoperabilität als auch, weil sie in einer speicherkritischen Umgebung verwendet wird.Erzwingen von nicht ausgerichteten Bitfeldpackung in MSVC
Die folgende Struktur besteht aus drei 15-Bit-Zahlen, einer 2-Bit-Nummer und einem 1-Bit-Zeichen. 15 + 15 + 15 + 2 + 1 = 48, also sollte es theoretisch in sechs Bytes passen, oder?
struct S
{
unsigned short a:15;
unsigned short b:15;
unsigned short c:15;
unsigned short d:2;
unsigned short e:1;
};
Dies ist jedoch in sizeof(S) == 8
auf beiden GCC und MSVC Ergebnisse zu kompilieren. Da ich dachte, dass dies mit der Ausrichtung zu tun haben könnte, habe ich versucht, #pragma pack(1)
vor der struct-Deklaration zu verwenden und dem Compiler mitzuteilen, dass er zurück zu byte, not int, bounds geht. Auf GCC, this worked, resultierend in sizeof(S) == 6
.
Allerdings, auf MSVC05, die Größe kam immer noch auf 8, auch mit pack(1)
gesetzt! Nachdem ich this other SO answer gelesen habe, habe ich versucht, unsigned short d
durch unsigned char
und unsigned short e
durch bool
zu ersetzen. Das Ergebnis ist sizeof(S)
== !
Ich habe festgestellt, dass, wenn ich d in zwei Ein-Bit-Felder und zwängte sie zwischen den anderen Mitgliedern, die Struktur schließlich richtig verpackt.
struct S
{
unsigned short a:15;
unsigned short dHi : 1;
unsigned short b:15;
unsigned short dLo : 1;
unsigned short c:15;
unsigned short e:1;
};
printf("%d\n", sizeof(S)); // "6"
Aber mit d Split so umständlich und verursacht für mich Ärger später, als ich auf der Struktur zu arbeiten. Gibt es eine Möglichkeit, MSVC zu zwingen, diese Struktur in 6 Bytes zu packen, genau wie GCC?
Danke für die Referenz - das ist gut zu wissen. – Crashworks
Hervorragende Referenz! Hat mir bei meinem Problem geholfen (VC++ hat mein 16-Bit-Bitfeld immer in eine 4-Byte-Struktur verwandelt. Jetzt weiß ich warum – nirbruner