带包装的尺寸结构(推,1)

sizeof struct with pack(push,1)

本文关键字:结构 包装      更新时间:2023-10-16

我在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似乎将a5a6打包到a7使用的uint16_t中。

您可能有更多相似的结果:

#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)

此结构的大小返回真实答案:

#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)