如何在Windows上紧密打包结构?

时间:2019-06-16 15:31:26

标签: c++ c windows struct padding

我正在尝试创建一个打包的结构,该结构表示特定数据包的标头。因此,它必须没有任何填充以匹配规范中给定的大小。但是,在Windows上,无论我如何告诉编译器紧紧包装结构,该字段在最后一个字段之后都将保留1字节的填充。

我在Compiler Explorer和大多数平台上都尝试了此代码,但除MSVC之外,我都得到了想要的结果。我还尝试了使用GCC在Linux的Windows子系统(WSL)上运行,这再次给了我适当的结果。我只在Windows上遇到填充问题。

该结构的简化版本如下:

typedef struct
{
    unsigned a : 10;
    unsigned b : 1;
    unsigned c : 5;
    unsigned d : 8;
} __attribute__((packed)) A;

使用MSVC:

#pragma pack(push, 1)
typedef struct
{
    unsigned a : 10;
    unsigned b : 1;
    unsigned c : 5;
    unsigned d : 8;
} A;
#pragma pack(pop)

对于MSVC,我还尝试将/ Zp1编译器参数默认添加为1字节对齐。

我希望结构的大小为3个字节。在具有gcc或clang的Linux上可以,但是在具有MinGW GCC或MSVC的Windows上,大小始终为4字节。

1 个答案:

答案 0 :(得分:2)

如果将类型更改为此:

#pragma pack(push, 1)
typedef struct
{
    unsigned short a : 10;
    unsigned short b : 1;
    unsigned short c : 5;
    unsigned char d : 8;
} A;
#pragma pack(pop)

然后它确实显示为3个字节。

您还可以手动模拟位域,以最大程度地减少此类意外。