sizeof struct with pack(push,1)

问题描述 投票:1回答:2

我在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

为什么?

c++ sizeof
2个回答
1
投票

bitfield是特定于实现的。

似乎msvc使用

struct test1{
    uint8_t  // a1, a2, a3, a4
    uint8_t  // a5, a6
    uint16_t // a7
};

可能是因为a6使用uint8_ta7使用uint16_t

gcc似乎将a5a6打包到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)

-2
投票

这个结构的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)
© www.soinside.com 2019 - 2024. All rights reserved.