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
どうやらデータ型に収まるようにメモリは確保されるらしい
参考
※間違ってたらすみません。
わかった時点で修正します。
コメント
コメントを投稿