我正在尝试创建一个打包的结构,该结构表示特定数据包的标头。因此,它必须没有任何填充以匹配规范中给定的大小。但是,在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字节。
答案 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个字节。
您还可以手动模拟位域,以最大程度地减少此类意外。