構造体のサイズ
構造体を作ってみて、サイズを調べるってことをやります。
struct samp { int a; char c; int d; char e[3]; };
さて問題
構造体samp型の変数を作ったら、サイズはいくつになるでしょう?
- int a; 4byte
- char c;1byte
- int d; 4byte
- char e[3];3byte
(4+1+4+3) = 12byte
になるでしょうか?
以下のようなプログラムを書いて確認してみます。
型や変数のサイズを調べるにはsizeof演算子を使います。
関数のように使うことが多いですが、演算子です。
sizeof(型や変数)
で、調べたいもののバイト単位のサイズが返ってきます。
int main() { struct samp { int a; char c; int d; char e[3]; }; cout << "sizeof(int)=" << sizeof(int) << endl; cout << "sizeof(char)=" << sizeof(char) << endl; cout << "sizeof(samp)=" << sizeof(samp) << endl; }
実行結果
sizeof(int)=4 sizeof(char)=1 sizeof(samp)=16
あれ12byteじゃない
ここでいっこ豆知識。
プログラムやデータは、メモリからCPUのレジスタに読み込まれ実行されます(この辺は説明を他に委ねます)。その時にCPUはメモリから適切で任意な大きさでデータを取ってこれるのでしょうか?
C++で一番小さい型のデータサイズはcharの1byteです。これは、CPUが1回にメモリにアクセスしてやり取りできるデータサイズによるものです。近年の(おそらく)多くのCPUが1byteごとのアクセスを基本にしています。授業でやりましたが、ポインタを使うときメモリのアドレスが1byteごとなのはそのためです。
- 注目点その1
- メモリは1byteごとに区切られて並べられる。
- もし1byteに満たないデータがあったとしてもその最小単位は1byteでアクセスされる=最小単位はchar型
通常の変数を作るときは、プログラムで使えるメモリ上の領域の空いているところに、ポイポイとアドレスとをっていくのであまりメモリが前からきっちり詰まっているかどうか気にする機会はないと思います。
また、配列なども希望の大きさの配列が連続でとれる領域を自動で確保するためあまり気にする機会はないと思われます。
char a; char b; int c; int d;