如何正确使用#pragma pack对齐结构体以实现112字节的指定大小
问题根因
#pragma pack(N)的作用是设置结构体成员的最大对齐系数,并非强制每个成员都占用N字节的存储空间:如果成员本身的自然对齐要求小于N,会按自身大小对齐,只有成员对齐要求大于N时才会按N对齐。你预期14个成员每个占8字节的计算逻辑不符合该指令的实际作用。
现有结构输出80字节的计算逻辑(假设当前平台long为4字节):
- 前6个
long每个占4字节,合计24字节,无填充 - 后续
char[8]占8字节,合计32字节,无填充 - 5个
double每个占8字节,合计40字节,累计72字节,无填充 - 最后2个
long每个占4字节,合计8字节,累计80字节,整体大小为8的倍数(最大成员double对齐要求为8),无需额外填充
解决方案
要实现总大小112字节的需求,可以选择以下两种方案:
方案1:显式添加填充字节
兼容性最好,不受编译器版本限制:
#include <iostream> using namespace std; #pragma pack(8) struct Deal { long deal_ticket; char reserved1[4]; long order_ticket; char reserved2[4]; long position_ticket; char reserved3[4]; long time; char reserved4[4]; long type; char reserved5[4]; long entry; char reserved6[4]; char symbol[8]; double volume; double price; double profit; double swap; double commission; long magic; char reserved7[4]; long reason; char reserved8[4]; }; #pragma pack(pop) int main() { cout << sizeof(Deal) << endl; // 输出112 }
方案2:使用C++11标准alignas修饰符
代码更简洁,支持C++11及以上标准的编译器均可使用:
#include <iostream> using namespace std; struct Deal { alignas(8) long deal_ticket; alignas(8) long order_ticket; alignas(8) long position_ticket; alignas(8) long time; alignas(8) long type; alignas(8) long entry; alignas(8) char symbol[8]; alignas(8) double volume; alignas(8) double price; alignas(8) double profit; alignas(8) double swap; alignas(8) double commission; alignas(8) long magic; alignas(8) long reason; }; int main() { cout << sizeof(Deal) << endl; // 输出112 }
注意事项
- 如果需要跨平台兼容,建议使用
<cstdint>头文件中的定长类型(如int32_t、int64_t)替代long,避免不同平台long长度差异导致结构体大小不符合预期。 - 使用
#pragma pack时建议配对使用#pragma pack(pop),避免修改默认对齐规则影响后续代码的结构体布局。
内容的提问来源于stack exchange,提问作者Iván Rodríguez
相关产品推荐
相关产品推荐

