我在qt项目中有结构:
#pragma pack(push,1)
struct test1{
uint8_t a1 : 3;
uint8_t a2 : 1;
uint8_t a3 : 3;
uint8_t a4 : 1;
uint8_t a5 :3;
uint8_t a6 : 1;
uint16_t a7 : 12;
};
#pragma pack(pop)
检查它的大小。
qDebug() << "sizeof(Mi28NE::test1)" << sizeof(Mi28NE::test1);
结果MinGW编译器:
>> sizeof(Mi28NE::test1) 3
MSVC编译器中的结果:
>> sizeof(Mi28NE::test1) 4
为什么?
bitfield是特定于实现的。
似乎msvc使用
struct test1{
uint8_t // a1, a2, a3, a4
uint8_t // a5, a6
uint16_t // a7
};
可能是因为a6
使用uint8_t
而a7
使用uint16_t
。
gcc似乎将a5
和a6
打包到uint16_t
使用的a7
中。
您可能会得到更多类似的结果:
#pragma pack(push,1)
struct test1{
uint8_t a1 : 3;
uint8_t a2 : 1;
uint8_t a3 : 3;
uint8_t a4 : 1;
uint16_t a5 : 3;
uint16_t a6 : 1;
uint16_t a7 : 12;
};
#pragma pack(pop)
这个结构的sizeof返回真正的答案:
#pragma pack(push,1)
struct test1{
uint8_t a1 : 3;
uint8_t a2 : 1;
uint8_t a3 : 3;
uint8_t a4 : 1;
uint16_t a5 : 3;
uint16_t a6 : 1;
uint16_t a7 : 12;
};
#pragma pack(pop)