C++子结构位域大小

C++ Substructure Bitfield Size

本文关键字:位域 结构 C++      更新时间:2023-10-16

请考虑以下事项:

class A { public:
    int     gate_type :  4;
    bool storage_elem :  1;
    uint8_t privilege :  2;
    bool      present :  1;
} __attribute__((packed));
class B { public:
    struct Sub {
        int     gate_type :  4;
        bool storage_elem :  1;
        uint8_t privilege :  2;
        bool      present :  1;
    } type_attr; //Also tried with "__attribute__((packed))" here in addition to outside
} __attribute__((packed));

编译器是 g++ 4.8.1。 sizeof(A(==1, sizeof(B(==4. 为什么会这样? 我需要类似结构 B 的东西来大小为 1。

这似乎是一个愚蠢的反问。 当我将您的示例重写为时,我得到了您想要的结果:

class A { public:
    int     gate_type :  4;
    bool storage_elem :  1;
    uint8_t privilege :  2;
    bool      present :  1;
} __attribute__((packed));
class B { public:
    A type_attr; //Also tried with "__attribute__((packed))" here in addition to outside
};

有什么原因不能在class B中重用class A的定义吗? 这似乎真的是更好的方法。

我记得,尽管具有相同的字段宽度,顺序等,但C和C++都不能保证struct Sub具有与class A相同的布局和相同的存储要求。 (在 C 的情况下,这将是 struct Sub vs. struct A ,但同样的想法成立,因为这些都是 POD 类型。

确切的行为应该依赖于 ABI。 不过,通过像我上面所做的那样重用class A,我认为你让自己对 ABI 问题免疫力更强。 (稍微,不是不可渗透的。