结构体强制1字节对齐
1. 背景
- 结构体成员对齐
C++ 编译器为了性能优化,会使用默认的对齐方式对结构体成员进行内存对齐(padding)。
这意味着结构体在内存中可能不是紧凑排列的,而是插入了填充字节。 - 写入文件时的问题
如果你直接将结构体写入文件,填充字节也会被写入,这会导致:
文件体积变大。
文件格式不兼容(尤其是跨平台或跨编译器时)。
读取时可能出错或数据错位。
2.使用#pragma pack(1)强制1字节对齐
#pragma pack(push, 标识)
#pragma pack(1)
//...
#pragma pack(pop, 标识)
pragma pack(push, enter_qfxfilehead)
作用:将当前的对齐设置保存起来,并设置一个新的对齐方式(这里是 1 字节对齐)。
push:表示“压栈”,即保存当前的对齐设置。
enter_qfxfilehead:是一个标识符(名字可以自定义),用于后面 pop 时恢复这个特定的对齐设置。
pragma pack(pop, enter_qfxfilehead)
作用:恢复之前保存的对齐设置。
pop:表示“出栈”,即恢复之前 push 保存的对齐方式。
enter_qfxfilehead:必须与前面的 push 标识符一致,表示恢复的是这个特定的设置。
为什么要这么做?
在定义结构体时,使用 #pragma pack(1) 可以取消编译器的默认对齐,让结构体在内存中紧凑排列,避免插入填充字节。
使用 push 和 pop 的好处是:
只影响当前结构体定义区域;
不会影响其他代码的对齐设置;
更安全、更可维护。

浙公网安备 33010602011771号