Oracle Solaris Studio 12.2:C++ 用户指南

B.2.15 #pragma pack( n)


#pragma pack([n])

可使用 pack 影响对结构成员的封装。

如果使用了该项,n 必须为 0 或 2 的幂。0 以外的值指示编译器针对数据类型使用 n 字节对齐和平台的自然对齐中的较小者。例如,以下指令使在指令后面(以及后续的 pack 指令前面)定义的所有结构成员对齐时依据的字节边界不严于 2 字节边界,即使正常对齐是 4 或 8 字节边界也是如此。


#pragma pack(2)

n 为 0 或省略该项时,成员对齐还原为自然对齐值。

如果 n 值等于或大于平台上最严格的对齐时,则采用自然对齐。下表显示了每个平台最严格的对齐。

表 B–1 平台上最严格的对齐

平台  

最严格的对齐  

x86 

SPARC 通用、V8、V8a、V8plus、V8plusa、V8plusb 

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