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

How to pack a struct tightly on Windows?

我正在尝试创建一个表示特定数据包的 header 的压缩结构。因此,它不能有任何填充以匹配规范中给定的大小。但是,在 Windows 上,无论我如何告诉编译器紧密打包结构,它都会在最后一个字段后填充 1 字节。

我已经在 Compiler Explorer 上尝试了这段代码,在大多数平台上我都得到了我想要的结果,MSVC 除外。我还尝试了 Windows Subsystem for Linux (WSL) with GCC,这再次给了我一个正确的结果。我只在 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 字节。

如果将类型更改为:

#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 个字节。

您也可以手动模拟位域,以尽量减少此类意外。