C

【C言語】メモリを効率的に使えるビットフィールドを解説!!

C言語でif文でtrue/false判定をすることを考えてみましょう。

以下のようなtrue/false判定をするための構造体を用意してみます。

この構造体はisValudated(有効かどうか)、isUsed(使われているかどうか)という情報を保存するためのものです。

この2つの情報を保持するためには、0か1かしか無いので必要なメモリ領域は2バイトだということが分かります。

ここで以下のようにこの構造体のサイズを出力してみます。

出力は、

となります。

つまり本来必要なバイト数は2バイトにもかからわず、構造体のメモリ領域が8バイトになってしまっているわけです。

この場合は無駄が6バイト分なので大した問題にはならないのですが、

true/false用のメンバが沢山ある場合や構造体が何個も存在している場合には、無視できない規模のメモリの無駄遣いになってしまいます。

こんなときにメモリ領域を活用するために役に立つ機能が、『ビットフィールド』です。

ビットフィールドは構造体に備わっている機能で、

『型 名前: サイズ;』

というふうに使います。

サイズはビット数のことです。5とすれば、その変数には5ビットのメモリ領域が割り当てられることになります。

このコードは、構造体のメンバにビットフィールドを適用した例です。

構造体変数のメモリ領域は

となっていますが、メンバ変数に使われている実際のメモリ領域は2ビットとなっています。

以下のコードも実行してみましょう。

やはり、構造体のメモリ領域は4バイトとなっています。
構造体のメンバは1ビットが32個分で32ビット(=4バイト)になります。

ちなみにあと1ビットのメンバをあと1つ増やすと、構造体のメモリ領域は8バイトになります。(確かめてみましょう!)