Auf meine Frage, wollen wir klären mit einem Beispielprogramm beginnen:Was macht VC++ beim Packen von Bitfeldern?
#include <stdio.h>
#pragma pack(push,1)
struct cc {
unsigned int a : 3;
unsigned int b : 16;
unsigned int c : 1;
unsigned int d : 1;
unsigned int e : 1;
unsigned int f : 1;
unsigned int g : 1;
unsigned int h : 1;
unsigned int i : 6;
unsigned int j : 6;
unsigned int k : 4;
unsigned int l : 15;
};
#pragma pack(pop)
struct cc c;
int main(int argc, char **argv)
{ printf("%d\n",sizeof(c));
}
Der Ausgang „8“ ist, was bedeutet, dass die 56 Bits (7 Byte) Ich möchte in 8 Byte gepackt werden packen, scheinbar ein ganzes Byte verschwenden. Neugierig, wie der Compiler diese Bits aus im Speicher lag, habe ich versucht, bestimmte Werte zu &c
schreiben, zB:
int main (int argc, char ** argv)
{
unsigned long long int* pint = &c;
*pint = 0xFFFFFFFF;
printf("c.a = %d", c.a);
...
printf("c.l = %d", c.l);
}
Vorhersagbar auf x86_64 mit Visual Studio 2010, passiert folgendes:
*pint = 0x00000000 000000FF :
c[0].a = 7
c[0].b = 1
c[0].c = 1
c[0].d = 1
c[0].e = 1
c[0].f = 1
c[0].g = 0
c[0].h = 0
c[0].i = 0
c[0].j = 0
c[0].k = 0
c[0].l = 0
*pint = 0x00000000 0000FF00 :
c[0].a = 0
c[0].b = 0
c[0].c = 0
c[0].d = 0
c[0].e = 0
c[0].f = 0
c[0].g = 1
c[0].h = 127
c[0].i = 0
c[0].j = 0
c[0].k = 0
c[0].l = 0
*pint = 0x00000000 00FF0000 :
c[0].a = 0
c[0].b = 0
c[0].c = 0
c[0].d = 0
c[0].e = 0
c[0].f = 0
c[0].g = 0
c[0].h = 32640
c[0].i = 0
c[0].j = 0
c[0].k = 0
c[0].l = 0
usw.
Vergessen Portabilität für einen Moment und annehmen, dass Sie über eine CPU, einen Compiler Pflege und eine Laufzeitumgebung. Warum kann VC++ diese Struktur nicht in 7 Bytes packen? Ist es eine Wortlänge? Die MSDN docs on #pragma pack
sagt "die Ausrichtung eines Elements wird auf einer Grenze, die entweder ein Vielfaches von n [1 in meinem Fall] oder ein Vielfaches der Größe des Elements ist, je nachdem, was kleiner ist." Kann jemand mir eine Idee davon geben, warum ich eine Größe von 8 und nicht 7 bekomme?
Die Dokumentation sagt "... wird auf einer Grenze sein, die ist ..."; Ich kann jedoch nicht finden, wo es etwas über eine Größengarantie sagt. –