c-lang:ビットフィールド
ビットフィールド あるいは フィールド
構造体の機能の一つで、ビット単位でデータを扱うことができるもの。
フィールドについては、ほとんどすべてが処理系に依存する。
フィールドが語の境界にまたがってよいかどうかも処理系により異なる。
フィールドはマシンによっては左から右へ割り当てられることもあるし、右から左へ割り当てられることもある。
このことは、外部で定義されたデータを取り出すときには注意深い考慮がいることをしめしている。
そうしたことに左右されるプログラムは、移植可能ではない。
フィールドはint として宣言してもよいが、移植可能にするには、signed または、unsigned を明示的に指定すべきである。
フィールドは配列ではないし、アドレスを持っていないから、フィールドには &演算子は適用できない。
ビットフィールドを使って圧縮した構造体は、ビットフィールドからデータの取り出しをする処理は、遅くなりがちになる。
メモリの節約が必要で無いときは使わないほうがよい。
圧縮構造体
メモリ使用量が最小になるように構造体を宣言すること。
ビットフィールドの宣言
データ型 メンバ名 : ビット幅 ;
code:cpp
struct hogehoge { unsigned int bit1 : 1; unsigned int bit2 : 1; unsigned int bit3 : 1; };
ビットフィールドのビット幅
code:cpp
struct hogehoge { unsigned int bit1 : 1; unsigned int bit2 : 1; unsigned int bit3 : 3; /* 3ビット使用する */ };
ビットのパディング
code:cpp
struct hogehoge { unsigned int bit1 : 1; unsigned int : 1; /* 1ビットパディング */ unsigned int bit2 : 1; unsigned int bit3 : 1; };
ビットフィールドのメンバ参照
普通の構造体と同じ。