60行目: 60行目:
== ビットフィールド ==
== ビットフィールド ==
メモリの使用を最適化するために、構造体内でビットフィールドが使用できる。<br>
メモリの使用を最適化するために、構造体内でビットフィールドが使用できる。<br>
これは、個々のビットレベルでデータを管理することができる。<br>
<br>
このようなビットフィールドの使用は、メモリが制限されている環境やハードウェアレジスタと直接やり取りする必要がある場合等、<br>
効率的なメモリ使用が重要な場面で特に有用である。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  struct Flags {
  struct Flags {
     unsigned int flag1 : 1;
     unsigned int flag1 : 1; // 1[bit]のフィールドとして定義されており、本質的にブール値 (0 または 1) が格納できる
     unsigned int flag2 : 1;
     unsigned int flag2 : 1; // 1[bit]のフィールドとして定義されており、本質的にブール値 (0 または 1) が格納できる
     unsigned int data  : 6;
     unsigned int data  : 6; // 6[bit]のフィールドとして定義されており、0 から 63 (2^6 - 1) の範囲の値が格納できる
  };
  };
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
Flags f;
f.flag1 = 1;    // フラグをオンに設定
f.flag2 = 0;    // フラグをオフに設定
f.data = 42;    // 6ビットの範囲内の値を設定
if (f.flag1) {
    // flag1 がオンの場合の処理
}
// data の値を出力 (0 - 63の範囲)
std::cout << "Data value: " << f.data << std::endl;
</syntaxhighlight>
<br>
この構造体の特徴とメリットを以下に示す。<br>
* メモリ効率
*: 一般的に、unsigned int型は32[bit] (4[byte]) を使用する。
*: この構造体は合計で8[ビット] (1[byte]) しか使用しない。
*: 結果として、メモリ使用量が75[%]削減される。
*: <br>
* パッキング
*: コンパイラは、これらのビットフィールドを1つのunsigned int型にパックする。
*: <br>
* アクセス
*: これらのフィールドは、通常の構造体のメンバのようにアクセスできるが、値は自動的に適切なビット数に制限される。
<br><br>
<br><br>