#pragma pack的作用
#pragma pack 是C/C++中的预处理指令,主要用于控制结构体、联合体等数据类型在内存中的对齐方式,作用如下:
- 指定对齐字节数:通过 #pragma pack(n) 可指定结构体按n字节对齐(n通常为1、2、4、8、16等2的幂次)。例如 #pragma pack(1) 表示取消字节对齐,结构体成员紧密排列。
- 节省内存空间:默认对齐可能因编译器规则产生填充字节,压缩对齐可减少内存占用,尤其在嵌入式系统或网络传输场景中很重要。
- 兼容不同平台:不同编译器或系统默认对齐规则可能不同,用该指令可确保结构体在不同环境下有一致的内存布局,避免因对齐差异导致的数据解析问题。
通常配合 #pragma pack(pop) 或 #pragma pack() 恢复默认对齐,使用时需注意n的取值应合理,避免因过度压缩影响访问效率。#include <stdio.h>
// 未指定对齐时(默认对齐)
#pragma pack(push) // 保存默认对齐状态
struct DefaultAlign {
char a; // 1字节
int b; // 4字节,默认对齐下,a后填充3字节
short c; // 2字节,b后填充2字节(总占8字节)
};
#pragma pack(pop) // 恢复默认对齐
// 指定按1字节对齐(无填充)
#pragma pack(1)
struct OneByteAlign {
char a; // 1字节
int b; // 4字节,紧跟a后,无填充
short c; // 2字节,紧跟b后(总占7字节)
};
#pragma pack() // 恢复默认对齐
// 指定按2字节对齐(部分填充)
#pragma pack(2)
struct TwoByteAlign {
char a; // 1字节,后填充1字节(对齐到2字节)
int b; // 4字节(本身是2的倍数,无需填充)
short c; // 2字节(对齐到2字节,紧跟b后)
// 总占1+1(填充)+4+2=8字节
};
#pragma pack(pop) // 恢复之前保存的默认对齐
int main() {
printf("默认对齐结构体大小:%lu字节\n", sizeof(DefaultAlign));
printf("1字节对齐结构体大小:%lu字节\n", sizeof(OneByteAlign));
printf("2字节对齐结构体大小:%lu字节\n", sizeof(TwoByteAlign));
return 0;
}
输出:
默认对齐结构体大小:8字节
1字节对齐结构体大小:7字节
2字节对齐结构体大小:8字节