#pragma pack([n]) |
可使用 pack 影响对结构成员的封装。
如果使用了该项,n 必须为 0 或 2 的幂。0 以外的值指示编译器针对数据类型使用 n 字节对齐和平台的自然对齐中的较小者。例如,以下指令使在指令后面(以及后续的 pack 指令前面)定义的所有结构成员对齐时依据的字节边界不严于 2 字节边界,即使正常对齐是 4 或 8 字节边界也是如此。
#pragma pack(2) |
n 为 0 或省略该项时,成员对齐还原为自然对齐值。
如果 n 值等于或大于平台上最严格的对齐时,则采用自然对齐。下表显示了每个平台最严格的对齐。
表 B–1 平台上最严格的对齐
平台 |
最严格的对齐 |
---|---|
x86 |
4 |
SPARC 通用、V8、V8a、V8plus、V8plusa、V8plusb |
8 |
SPARC V9、V9a、V9b |
16 |
pack 指令应用于自身与下一个 pack 指令之间的所有结构定义。如果在具有不同包装的不同转换单元中定义了相同的结构,那么程序会因某种原因而失败。具体来说,不应该在包括定义预编译库接口的头文件之前使用 pack 指令。建议将 pack 指令放在要封装的结构紧前面的程序代码中,并将 #pragma pack() 放在该结构紧后面。
如果在 SPARC 平台上使用 #pragma pack 封装效果比类型的缺省对齐紧密,必须为应用程序的编译和链接指定 -misalign 选项。下表显示了整型数据类型的存储大小和缺省对齐。
表 B–2 存储大小和缺省对齐字节数
类型 |
SPARC V8 大小,对齐 |
SPARC V9 大小,对齐 |
x86 大小,对齐 |
---|---|---|---|
bool |
1,1 |
1,1 |
1,1 |
char |
1,1 |
1,1 |
1,1 |
short |
2,2 |
2,2 |
2,2 |
wchar_t |
4,4 |
4,4 |
4,4 |
int |
4,4 |
4,4 |
4,4 |
long |
4,4 |
8,8 |
4,4 |
float |
4,4 |
4,4 |
4,4 |
double |
8,8 |
8,8 |
8,4 |
long double |
16,8 |
16,16 |
12,4 |
指向数据的指针 |
4,4 |
8,8 |
4,4 |
指向函数的指针 |
4,4 |
8,8 |
4,4 |
指向成员数据的指针 |
4,4 |
8,8 |
4,4 |
指向成员函数的指针 |
8,4 |
16,8 |
8,4 |