#pragma pack
指示编译器以特定对齐方式打包结构成员。大多数编译器在声明结构时会在成员之间插入填充,以确保它们与内存中的适当地址对齐(通常是类型大小的倍数)。这避免了与访问未正确对齐的变量相关的某些架构的性能损失(或彻底错误)。例如,给定 4 字节整数和以下结构:
struct Test
{
char AA;
int BB;
char CC;
};
编译器可以选择将结构体放置在内存中,如下所示:
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
and sizeof(Test)
将为 4 × 3 = 12,即使它只包含 6 个字节的数据。最常见的用例#pragma
(据我所知)是在使用硬件设备时,您需要确保编译器不会在数据中插入填充,并且每个成员都遵循前一个成员。和#pragma pack(1)
,上面的结构将如下所示:
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
And sizeof(Test)
将为 1 × 6 = 6。
With #pragma pack(2)
,上面的结构将如下所示:
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
And sizeof(Test)
将为 2 × 4 = 8。
结构体中变量的顺序也很重要。变量排序如下:
struct Test
{
char AA;
char CC;
int BB;
};
与#pragma pack(2)
,该结构将如下所示:
| 1 | 2 |
| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
and sizeOf(Test)
将为 3 × 2 = 6。