C ++子结构位域大小

时间:2013-07-04 06:52:10

标签: c++ bit-fields

请考虑以下事项:

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。

1 个答案:

答案 0 :(得分:3)

这似乎是一个愚蠢的反问题。当我将你的例子重写为:

时,我得到你想要的结果
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 A内重复使用class B的定义?这似乎是更好的方法。

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

确切的行为应该是ABI依赖的。但是,正如我在上面所做的那样重复使用class A,我认为你会让自己对ABI问题有更多的免疫力。 (稍微不是不透水的。)