WisdomSoft - for your serial experiences.

2.7 sizeof演算子

sizeof 演算子を用いて型名や変数から割り当てられるデータサイズを取得できます。

2.7.1 型のサイズを取得する

前述したように、C++ 言語で扱う値は型によって種類が分けられており、型によってデータサイズ(メモリ消費量)が決定します。開発環境のドキュメントを調べれば型のサイズを知ることができますが、より確実な方法があります。それは sizeof 演算子を使って変数のサイズを取得することです。

sizeof 演算子は sizeof キーワードに続いてサイズを取得したい型名を ( ) で括ります。これまで、演算子といえば + や * といった記号を使いましたが sizeof 演算子のようにキーワードを使う演算子も存在します。

sizeof 演算子(型名)
sizeof (型)

sizeof 演算子は与えられた型のサイズをバイト単位の符号なし整数で返します。例えば sizeof (int) と指定した場合、int 型が 32 ビットの場合 4 という結果が得られます。

コード1
#include <iostream>

int main()
{
	int intSize = sizeof(int);
	std::cout << "int=" << intSize << "\n";
	return 0;
}
実行結果
コード1 実行結果

型のサイズはコンパイル時に判断できるため sizeof 演算子は実行時に計算されるものではありません。Visual C++ を含む一般的なコンパイラでは、ビルド時に sizeof 演算子が指定された型のサイズを表す整数に置き換えられます。よって、コード1の sizeof 演算子の計算コストは

int intSize = 4;

と同じだと解釈できます。実際にコード1をデバッグ実行し、逆アセンブルを表示すると確認できます。

図1
図1 sizeof 演算子のコンパイル結果

図1の下線部が int intSize = sizeof(int) に相当するアセンブリです。これは mov というアセンブリの命令を用いて intSize 変数に 4 を読み込むという意味です。アセンブリの詳細を理解する必要はありません。コードを見れば sizeof 演算子に相当する部分が 4 という整数リテラル(アセンブリの用語では即値と呼ぶ)に変換されています。

コード1では sizeof 演算子の結果を int 型の変数で受け取っていますが、正確には sizeof 演算子の結果は size_t 型と定められています。よって、もし正確なコードを心がけるのであれば次のように書くべきでしょう。

size_t intSize = sizeof(int);

この size_t はキーワードではなく符号なし整数の別名(通常は unsigned int)であると解釈されます。従って unsigned int や、符号付きで問題のない範囲であるならば int 型で受け取っても大丈夫です。

コード2
#include <iostream>

int main()
{
	std::cout << "char=" << sizeof(char) << "\n";
	std::cout << "wchar_t=" << sizeof(wchar_t) << "\n";
	std::cout << "short=" << sizeof(short) << "\n";
	std::cout << "int=" << sizeof(int) << "\n";
	std::cout << "long=" << sizeof(long) << "\n";
	std::cout << "long long=" << sizeof(long long) << "\n";
	std::cout << "float=" << sizeof(float) << "\n";
	std::cout << "double=" << sizeof(double) << "\n";
	std::cout << "long double=" << sizeof(long double) << "\n";
	return 0;
}
実行結果
コード2 実行結果

コード2は C++ の基本型のサイズを sizeof 演算子で取得して表示しています。これは Visual C++ でコンパイルしたプログラムの実行結果です。他のコンパイラやシステム、コンピュータによって結果は変わる可能性があることに注意してください。

2.7.2 変数のサイズを取得する

型名ではなく変数からもサイズを取得できます。変数からサイズを取得するには、以下の形式の sizeof 演算子を用います。

sizeof 演算子(式)
sizeof 単項式

sizeof キーワードに続いてサイズを調べる式を指定します。ここに変数を指定すれば、変数のサイズが返されます。コンパイラは sizeof 演算子に渡された式から型を推論できるため、この場合もコンパイル時に結果が解決されます。

コード3
#include <iostream>

int main()
{
	short s = 0;
	int i = 0;
	
	std::cout << "sizeof s=" << sizeof s << "\n";
	std::cout << "sizeof i=" << sizeof i << "\n";
	return 0;
}
実行結果
コード3 実行結果

コード3は short 型の s 変数と int 型の i 変数を sizeof 演算子に指定し、それぞれのサイズを出力しています。実行結果を見れば s 変数のサイズは short 型のサイズに、i 変数のサイズは int 型のサイズに等しいことが確認できます。