Para aclarar mi pregunta, vamos a empezar con un programa de ejemplo:¿Qué está haciendo VC++ al empacar bitfields?
#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));
}
La salida es "8", lo que significa que los 56 bits (7 bytes) que quieren hacer las maletas están siendo empaquetados en 8 bytes, aparentemente desperdiciando un byte completo. Curiosidad acerca de cómo el compilador estaba colocando estos bits en la memoria, he intentado escribir valores específicos a &c
, por ejemplo:
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);
}
Como era de esperar, el uso de x86_64 visual Studio 2010, ocurre lo siguiente:
*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
etc.
Forget portabilidad por un momento y suponer que usted se preocupa por una CPU, un compilador y un entorno de ejecución. ¿Por qué no puede VC++ empacar esta estructura en 7 bytes? ¿Es una cosa de longitud de palabra? El MSDN docs en #pragma pack
dice "la alineación de un miembro estará en un límite que es un múltiplo de n [1 en mi caso] o un múltiplo del tamaño del miembro, el que sea más pequeño". ¿Alguien puede darme una idea de por qué obtengo un tamaño de 8 y no de 7?
La documentación dice "... estará en un límite que es ..."; Sin embargo, no puedo encontrar dónde dice nada sobre una garantía de tamaño. –