5

次の点を考慮してください。

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。これはなぜですか?サイズが1になるには、構造Bのようなものが必要です。

4

1 に答える 1

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 の場合はstruct Subvs.struct Aになりますが、これらはすべて POD 型であるため、同じ考えが成り立ちます。)

正確な動作は ABI に依存するはずです。ただし、上記のように再利用class Aすることで、ABI の問題に対する耐性がわずかに高まると思います。(わずかに、不浸透性ではありません。)

于 2013-07-04T07:15:27.533 に答える