#pragma pack可以用来修改该指令下面结构体(structure)成员的数据对齐规则。
语法:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBAbBwjDUzEX7_AO-jF_2PWoe4RO5qioY3Z0-SQ-J16-keNRskxnewCnN8qYggYKohH7OQJt8h6p-cL6qcTGY39VVLGmN6xYPH5LYwaTUwLXbPVxEb7iK27bc4Ose3B8T8gpksvcQCilA/s400/rnpgpack.gif)
1 | 2 | 4 | 8 | 16 | 结构体成员以指定的字节对齐或以自然边界对齐,取决于哪个占用字节数更少 |
nopack | 采用No packing方式,并且"nopack"被压入pack stack |
pop | pack 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 |
没有评论:
发表评论