结构体强制1字节对齐

1. 背景

  1. 结构体成员对齐
    C++ 编译器为了性能优化,会使用默认的对齐方式对结构体成员进行内存对齐(padding)。
    这意味着结构体在内存中可能不是紧凑排列的,而是插入了填充字节。
  2. 写入文件时的问题
    如果你直接将结构体写入文件,填充字节也会被写入,这会导致:
    文件体积变大。
    文件格式不兼容(尤其是跨平台或跨编译器时)。
    读取时可能出错或数据错位。

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 的好处是:
只影响当前结构体定义区域;
不会影响其他代码的对齐设置;
更安全、更可维护。

posted @ 2025-07-10 14:27  仰望星河Leon  阅读(98)  评论(0)    收藏  举报