#pragma pack(n)
使用 #pragma pack(n) 将影响结构或联合的成员封装。缺省情况下,结构或联合的成员在其自然边界对齐;对于 char 类型为一个字节,对于 short 类型为两个字节,对于 integer 类型为四个字节,依此类推。如果存在 n,则它必须是 2 的幂,为任何结构或联合成员指定最严格的自然对齐。不接受零。
#pragma pack(n) 指令应用于它后面的所有结构或联合定义,直到出现下一个 pack 指令。如果在具有不同包装的不同转换单元中定义了相同的结构或联合,那么程序会因某种原因而失败。特别是,不应在包含定义了预编译库的接口的头文件之前使用 #pragma pack(n)。#pragma pack(n) 的建议用法是,将它放在程序代码中紧挨在要封装的任何结构或联合的前面。在封装的结构后面紧跟 #pragma pack( )。
您可以使用 #pragma pack(n) 为结构或联合成员指定对齐边界。例如,#pragma pack(2) 会使 int、long、long long、float、double、long double 和指针与双字节边界对齐,而不是与其自然边界对齐。
如果 n 等于或大于您使用的平台上最严格的对齐(在 x86 上使用 -m32 时为 4,在 SPARC 上使用 -m32 时为 8,但使用 -m64 时为 16),则指令具有自然对齐的效果。同样,如果省略 n,成员对齐将恢复为自然对齐边界。
请注意,使用 #pragma pack 时,封装的结构或联合本身的对齐方式与其更严格对齐的成员相同。因此,该 struct 或 union 的任何声明将使用 pack 对齐。例如,只包含 char 数据的 struct 无对齐限制,而包含 double 数据的 struct 将按 8 字节边界对齐。