C++ ビットフィールド 書いて覚えるための初心者自己中記事
通常の型は最小単位でも1バイト
構造体や共有体の宣言時、メンバ変数名の後ろに : をつけて数値を書くと
そのメンバ変数はビット単位になる。
struct Date { unsigned short year : 7;//7bit unsigned short month : 4;//4bit unsigned short day : 5;//5bit };
この状態のメンバ変数はビットフィールドと呼ばれる。
ビットフィールドの型には整数型か列挙体型。
符号付き、無しは明示的に指定する必要あり。
実際の型より少なくはなるが、型の認識は変わらない。
型の認識は変わらないが、確保するメモリ領域が指定したビット分になる。
ビットフィールドのアドレスは取得できない。(アドレスはバイト単位だから)
参照にも渡せない。const参照へは渡せる、その場合はテンポラリオブジェクトが作られる。
メンバの一部でもOK
struct Date { unsigned short year; unsigned short month : 4; unsigned short day : 5; unsigned short weekday : 3; };
共有体の一部にする。
int main() { union { unsigned int i; unsigned int b4 : 4; }; i = 0x12345678; cout << b4 << endl; system("pause"); }
共有体の一部をビットフィールドにすると、上記の場合int i のどこかの4bit と共有される。
どこが共有されるかは処理系定義。
無名ビットフィールド
struct Date { unsigned short year; unsigned short month : 4; unsigned short : 5;//無名ビットフィールド unsigned short weekday : 3; };
メンバ変数名の無いビットフィールドを無名ビットフィールドという。
この場合、month と weekday の間に5bit のパディングが出来る。
さらに
struct Date { unsigned short year; unsigned short month : 4; unsigned short : 0;//無名ビットフィールド サイズ0 unsigned short weekday : 3; };
メンバ変数が無名ビットフィールドでサイズが0bit
この状態だと、メモリの次のバイト境界までパディングを入れる機能がある。
型のサイズ以上のビットフィールド
struct Date { unsigned int year:44;//int型が4byte 32bit の環境 unsigned short month : 4; unsigned short : 0; unsigned short weekday : 3; };
型のサイズ以上のビットフィールドを指定しても増えません。
あぶれた分がパディング状態になるだけ。
ここまで。