#pragma pack(n)的用法

时间:2023-01-31 12:51:49

#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));
#pragma pack(n)的用法

(2)

#pramga pack(4)

struct node

{
int e;
char f;
short int a;
char b;
};
struct node n;
printf("%d\n", sizeof(n));

#pragma pack(n)的用法

(3)

#pramga pack(2)

struct node

{
int e;
char f;
short int a;
char b;
};
struct node n;
printf("%d\n", sizeof(n));

#pragma pack(n)的用法

(4)

#pramga pack(1)

struct node

{
int e;
char f;
short int a;
char b;
};
struct node n;
printf("%d\n", sizeof(n));

#pragma pack(n)的用法