このビットフィールドのサイズが 4 なのはなぜですか?
サイズを2にする方法はありますか(以下のコードで明らかに意図されているように)、またはこれをきれいに行うことは不可能ですか?
struct S
{
unsigned short x : 15;
bool a : 1;
};
int main() { return sizeof(S); }
このビットフィールドのサイズが 4 なのはなぜですか?
サイズを2にする方法はありますか(以下のコードで明らかに意図されているように)、またはこれをきれいに行うことは不可能ですか?
struct S
{
unsigned short x : 15;
bool a : 1;
};
int main() { return sizeof(S); }
標準 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()
。