Visual C++ ofrece un modificador de compilador (/Zp
) y el pragma pack
para modificar la alineación de los miembros de struct. Sin embargo, parece que tengo una idea equivocada sobre cómo funcionan.Alineación de estructura en Visual C++
Según MSDN, para un valor de alineación dado n,
La alineación de un miembro habrá en un límite que es ya sea un múltiplo de n o un múltiplo del tamaño del miembro, lo es más pequeño.
Supongamos un valor de paquete de 8 bytes (que es el valor predeterminado). Dentro de una estructura, creo que cualquier miembro cuyo tamaño sea inferior a 8 bytes tendrá un desplazamiento que es un múltiplo de su propio tamaño. Cualquier miembro cuyo tamaño sea de 8 bytes o más estará en un desplazamiento que es un múltiplo de 8 bytes.
Ahora toma el siguiente programa:
#include <tchar.h>
#pragma pack(8)
struct Foo {
int i1;
int i2;
char c;
};
struct Bar {
char c;
Foo foo;
};
int _tmain(int argc, _TCHAR* argv[]) {
int fooSize = sizeof(Foo); // yields 12
Bar bar;
int fooOffset = ((int) &bar.foo) - ((int) &bar); // yields 4
return 0;
}
La estructura Foo
es de 12 bytes de tamaño. Así que dentro de Bar
, esperaría que el miembro Foo
esté en offset 8 (un múltiplo de 8) mientras que en realidad está en offset 4. ¿Por qué es eso?
Además, Foo
realmente solo tiene 4 + 4 + 1 = 9 bytes de datos. El compilador agrega automáticamente bytes de relleno al final. Pero, de nuevo, dado un valor de alineación de 8 bytes, ¿no debería rellenar un múltiplo de 8 en lugar de 4?
¡Cualquier aclaración apreciada!
¿Estás seguro de que tu 'int' solo tiene 4 bytes? ¿En qué máquina estás ejecutando esto? –
@Tony: es una aplicación de 32 bits. Si un int era 8 bytes en lugar de 4, un Foo con dos de ellos no podría ser solo de 12 bytes.:-) –