You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:18:02