【发布时间】:2019-10-30 09:28:18
【问题描述】:
我正在尝试创建一个打包结构,它代表特定数据包的标头。因此,它不能有任何填充以匹配规范中给出的大小。但是,在 Windows 上,无论我如何告诉编译器紧密打包结构,它都会在最后一个字段之后有一个 1 字节的填充。
我已经在 Compiler Explorer 上尝试过这段代码,并且在大多数平台上都得到了我想要的结果,除了 MSVC。我还尝试了带有 GCC 的 Windows Subsystem for Linux (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 字节。
【问题讨论】:
-
unsigned int /* assumes 24+ bits */ A; unsigned a = A & 0x3ff; unsigned b = (A && 0x400) >> 10; ...
标签: c++ c windows struct padding