В gcc есть свой способ указывать выравнивание для полей структур -- атрибут aligned
struct my_struct_aligned
{
short aligned_field_1;
int aligned_field_2 __attribute__((aligned (8)));
};
Для примера, вот программа для gcc
#include <stdio.h>
#pragma pack(push, 8)
struct my_struct_pack
{
short pack_field_1;
int pack_field_2;
};
#pragma pack(pop)
struct my_struct_aligned
{
short aligned_field_1;
int aligned_field_2 __attribute__((aligned (8)));
};
struct my_struct_union
{
union
{
short union_1_field_1; /* My data field */
char align_1[8]; /* Alignment 64 bits */
} _u1;
int union_field_2; /* This field is aligned to 64 bits */
};
#define union_field_1 _u1.union_1_field_1
int ptr_diff(void * p1, void * p2)
{
return (char *)p2 - (char *)p1;
}
int main()
{
struct my_struct_aligned sa;
struct my_struct_union su;
struct my_struct_pack sp;
printf( "pack: %d\n", ptr_diff( &(sp.pack_field_1), &(sp.pack_field_2) ) );
printf( "aligned: %d\n", ptr_diff( &(sa.aligned_field_1), &(sa.aligned_field_2) ) );
printf( "union: %d\n", ptr_diff( &(su.union_field_1), &(su.union_field_2) ) );
return 0;
}
У меня под gcc 3.3 получается такой вывод:
pack: 4
aligned: 8
union: 8
Получается, что gcc игнорирует #pragma pack. С другой стороны, ms vc обругает gcc-ный атрибут. Выходит, что использование union -- наиболее переносимый подход из представленных.