#pragma pack(n)
解释:
每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
规则:
(1)如果#pramga pack(n)中的n大于结构体成员中任何一个成员所占用的字节数,则该n值无效。编译器会选取结构体中最大数据成员的字节数为基准进行对齐。
(2)如果 n 小于该变量的类型所占用 的字节数,那么偏移量为 n 的倍数,不用满足默认的对齐方式。结构的总大小也有个 约束条件,分下面两种情况:如果 n 大于所有成员变量类型所占用的字节数,那么结 构的总大小必须为占用空间最大的变量占用的空间数的倍数; 否则必须为 n 的倍数。
例子:
(1)
#pramga pack(8)
struct node
{
int e;
char f;
short int a;
char b;
};
struct node n;
printf("%d\n", sizeof(n));
(2)
#pramga pack(4)
struct node
{
int e;
char f;
short int a;
char b;
};
struct node n;
printf("%d\n", sizeof(n));
(3)
#pramga pack(2)
struct node
{
int e;
char f;
short int a;
char b;
};
struct node n;
printf("%d\n", sizeof(n));
(4)
#pramga pack(1)
struct node
{
int e;
char f;
short int a;
char b;
};
struct node n;
printf("%d\n", sizeof(n));