C++言語 ビットフィールド サイズについて

ビットフィールドとして構造体を作ったときのメモリ確保について


構造体の変数としてビットフィールドを使用したときにどのようにメモリが確保されるか。

サンプルプログラム1

#include <iostream>
using namespace std;
struct k_bool{
    unsigned a : 8;
    unsigned b : 8;
    unsigned c : 8;
    unsigned d : 1;
    unsigned e : 1;
    unsigned f : 1;
    unsigned g : 1;
    unsigned h : 1;
};
int main(void){
    k_bool abcd;
    cout << "sizeof : " << sizeof(abcd);
}

これを実行すると次のようになる

sizeof : 4

構造体内のコロンの後の数字がビット数である。
つまり、上のプログラムでは合計29ビットとなる。
8ビットで1バイトなので単純に計算すると3.625バイトと4バイトには満たない。
では、dで8ビット確保するとどうなるのか?

#include <iostream>
using namespace std;
struct k_bool{
    unsigned a : 8;
    unsigned b : 8;
    unsigned c : 8;
    unsigned d : 8;
    unsigned e : 1;
    unsigned f : 1;
    unsigned g : 1;
    unsigned h : 1;
};
int main(void){
    k_bool abcd;
    cout << "sizeof : " << sizeof(abcd);
}

これを実行すると次のようになる

sizeof : 8
では、念のためにiを8ビットで追加して実行すると
#include <iostream>
using namespace std;
struct k_bool{
    unsigned a : 8;
    unsigned b : 8;
    unsigned c : 8;
    unsigned d : 8;
    unsigned e : 8;
    unsigned f : 8;
    unsigned g : 8;
    unsigned h : 8;
    unsigned i : 8;
};
int main(void){
    k_bool abcd;
    cout << "sizeof : " << sizeof(abcd);
}

これを実行すると次のようになる

sizeof : 12

データ型を変えるとどうだろう?

#include <iostream>
using namespace std;
struct k_bool{
    char a : 1;
    char b : 1;
    char c : 1;
    char d : 1;
    char e : 1;
    char f : 1;
    char g : 1;
    char h : 1;
    //char i : 1;
};
int main(void){
    k_bool abcd;
    cout << "sizeof : " << sizeof(abcd);
}
sizeof : 1
では、念のためにiを1ビットで追加して実行すると
#include <iostream>
using namespace std;
struct k_bool{
    char a : 1;
    char b : 1;
    char c : 1;
    char d : 1;
    char e : 1;
    char f : 1;
    char g : 1;
    char h : 1;
    char i : 1;
};
int main(void){
    k_bool abcd;
    cout << "sizeof : " << sizeof(abcd);
}
sizeof : 2

どうやらデータ型に収まるようにメモリは確保されるらしい


参考


※間違ってたらすみません。
わかった時点で修正します。

コメント

このブログの人気の投稿

ダイソー テープライト リモコン付 分解

C++ round関数を使わずに小数第n位の四捨五入をする

C++ cout関数とcin関数を用いた基本的な入出力