クラスのビット幅

Dec 06 2020

次のように宣言されたクラスがあります。

class Payload {
    uint8_t m_a : 1;
    uint8_t m_b : 5;
    uint8_t m_c : 2;
    uint8_t m_d : 4;
};

ほら、sizeof(Payload) == 2。ここまでは順調ですね。ビットの合計量は12で、8ビットを超えているため、2バイトが占有されます。

しかし、クラスが宣言するビットの量を取得する方法はありますか?'12'を返すつもりです...?理論的にはあらゆるサイズの、上記のようなあらゆる種類のクラス定義ビットフィールドに対してアルゴリズムを機能させるようにしてください。

回答

1 dfrib Dec 06 2020 at 04:16

いいえ、標準に準拠した方法ではありません。

[class.bit] / 1:

ビットフィールド属性は、クラスメンバーのタイプの一部ではありません

つまり、この情報はコンパイル時に抽出できません。ランタイムイントロスペクション手法を使用してこの情報を見つけようとするあらゆる種類の試みは、せいぜい実装で定義された動作に依存します。

1 Sneftel Dec 06 2020 at 03:32

sizeof(Payload)*CHAR_BIT。これにより、構造体のサイズがバイト単位で取得され、バイトあたりのビット数が乗算されます(技術的には常に8とは限りません)。これが機能するのは、ビットフィールドを含む構造体が、の倍数ではないビット単位のサイズを持つことができないためですCHAR_BIT。コンパイラは、最後のメンバーの後にパディングビットを追加します。