C/C++预编译指令#pragma pack用法

描述:
#pragma pack可以用来修改该指令下面结构体(structure)成员的数据对齐规则。

语法:




















1 | 2 | 4 | 8 | 16 结构体成员以指定的字节对齐或以自然边界对齐,取决于哪个占用字节数更少
nopack采用No packing方式,并且"nopack"被压入pack stack
poppack stack的顶部元素出栈
(no argument specified)#pragma ()和#pragma (pop)效果相同


注意:
#pragma pack预编译指令只能修改在它下面声明的结构体(structure)成员的数据对齐方式。

#pragma pack预编译指令不能增加成员(member)的对齐,相反它能减少成员的对齐。举例来说,一个整数(int)成员,#pragma pack (2)可以让该结构体成员以2-byte边界对齐,而#pragma pack (4)则不起作用。

#pragma pack是基于栈(stack)工作的。在对源代码作语法分析时,所有的pack value都被压栈。在当前pragma pack栈顶的值就是对齐下面结构体成员的值。

举例:

1. 在下面的代码中,结构体S2的成员以1-byte对齐,但结构体S1不变。这是因为S1在pragma预编译指令前声明,而S2在pragma预编译指令后声明,所以S2的对齐方式被改变了。
struct s_t1 {
char a;
int b;
#pragma pack(1)
struct s_t2 {
char x;
int y;
} S2;
char c;
int b;
} S1;


2. 在下面的例子中,我们可以看到#pragma pack是怎样改变结构体的size和mapping的

struct s_t {
char a;
int b;
short c;
int d;
}S;












































Default mapping: With #pragma pack(1):
sizeof S = 16 sizeof S = 11
offsetof a = 0 offsetof a = 0
offsetof b = 4 offsetof b = 1
offsetof c = 8 offsetof c = 5
offsetof d = 12 offsetof d = 7
align of a = 1 align of a = 1
align of b = 4 align of b = 1
align of c = 2 align of c = 1
align of d = 4 align of d = 1


没有评论:

发表评论