我想知道是否有人能向我解释一下#pragma pack
预处理器语句是做什么的,更重要的是,为什么要使用它.
我查看了MSDN page,它提供了一些见解,但我希望从有经验的人那里听到更多.我以前在代码中见过它,但我似乎再也找不到它的位置了.
我想知道是否有人能向我解释一下#pragma pack
预处理器语句是做什么的,更重要的是,为什么要使用它.
我查看了MSDN page,它提供了一些见解,但我希望从有经验的人那里听到更多.我以前在代码中见过它,但我似乎再也找不到它的位置了.
#pragma pack
指示编译器使用特定对齐方式打包 struct 成员.大多数编译器在声明 struct 时,都会在成员之间插入填充,以确保它们与内存中的适当地址对齐(通常是类型大小的倍数).这避免了与访问未正确对齐的变量相关的某些体系 struct 的性能损失(或直接错误).例如,给定4字节整数和以下 struct :
struct Test
{
char AA;
int BB;
char CC;
};
编译器可以 Select 这样在内存中布局 struct :
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
and sizeof(Test)
would be 4 × 3 = 12, even though it only contains 6 bytes of data. The most common use case for the #pragma
(to my knowledge) is when working with hardware devices where you need to ensure that the compiler does not insert padding into the data and each member follows the previous one. With #pragma pack(1)
, the struct above would be laid out like this:
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
And sizeof(Test)
would be 1 × 6 = 6.
对于#pragma pack(2)
,上面的 struct 布局如下:
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
And sizeof(Test)
would be 2 × 4 = 8.
struct 中变量的顺序也很重要.变量的顺序如下:
struct Test
{
char AA;
char CC;
int BB;
};
如果是#pragma pack(2)
, struct 的布局如下:
| 1 | 2 |
| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
sizeOf(Test)
等于3×2=6.