0

このビットフィールドのサイズが 4 なのはなぜですか?
サイズを2にする方法はありますか(以下のコードで明らかに意図されているように)、またはこれをきれいに行うことは不可能ですか?

struct S
{
    unsigned short x : 15;
    bool a : 1;
};

int main() { return sizeof(S); }
4

1 に答える 1

4

標準 C++ では不可能ですが、コンパイラ固有のプラグマまたは構造体の属性を使用することは可能です。

VC++ では、#pragma pack

また、サイズ 2 のみを取得するには、次のようにする必要があります。

#pragma pack(1)
struct s{
  unsigned short s1: 15;
  unsigned short b1: 1;
};

次のようにコードを使用#pragma packします。

struct S
{
    unsigned short x : 15;
    bool a : 1;
};

仮想的なメモリ レイアウトは次のようになります。

----------------------
+ 1 | 2 | 3 | 4 | 5 | ..
+   x   | a |
+---------------------

したがって、3バイトを占有します

あなたに変更bool aするunsigned short aと、これが得られます:

-------------------------
+ 1 | 2 | 3 | 4 | 5| ..
+   x |a|
-------------------------

これは2バイトしか占有しません。

コンパイラは、2 番目の short は 1 ビットしか使用しないため、構造を 2 バイトに圧縮することが可能であると判断します。しかし、別のタイプの構造体メンバーが使用されている場合 (boolの実装などS)、コンパイラーは、タイプが異なるため、実際には 1 ビットを絞り込むことができないと考えますunsigned short(タイプの境界を越えているため、残念ながら実装で定義されています)。したがって、2 ではなく3バイトを取得しますsizeof()

于 2013-02-07T11:23:08.450 に答える