| 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> | ||