sizeof
読み:サイズ-オブ
外語:sizeof

 C/C++/C#/Delphiなどで、値型のサイズを取得する機能。
目次

概要
 言語により仕様は異なるが、オブジェクトや型の占めるデータサイズをバイト単位で得る演算子関数である。
 結果は整数型で返される。

特徴

C/C++

C
 C/C++では予約語の一つであり、単項演算子である。つまりCにおいては、sizeofは関数ではなく演算子である。
 sizeof(foo)のように使われることが多いが、演算子なので()は必ずしも必要ではない。sizeof fooで求めることができる。但しintのような「型」の場合や、C++11から追加された可変長引数のtemplateの場合は()が必要である。
 結果はsize_t型で返される。
 Cにおいては、sizeofは定数式ではない。C90までは定数式と考えても差し支えなかったが、C99では「可変長配列」が導入されたため、そうではなくなった。
 int func(int n)
 {
 int array[n];
 ...
 }
 この関数中で「sizeof array」を求めた場合、理論上はsizeof(int)*nが求められる。しかしこの大きさは、実際に関数が呼ばれるまでは分からないため、定数式とならない。
 従って、switch文のラベルなど定数式が要求される箇所にsizeofを使うことはできない。

C++
 C++においては、当初の仕様ではsizeofは定数式である。switch文のラベルにsizeofを書くことができる。
 しかしC++ではC99の機能が積極的に取り込まれていることもあり、将来的に上述のような可変長配列がもし導入された場合、定数式ではなくなる。

型の大きさ
 規格では、整数型のサイズは、次のように定義されている。
 sizeof(short) ≦ sizeof(int) ≦ sizeof(long)
 C/C++では、このように大小関係のみが定義されており、実際のビット長などは定義されていない。
 また仕様上、sizeof(char)は常に1であることが求められている。

有効ビット長は得られない
 配列型構造体などの場合、処理系のアラインメントの都合に応じてパディングが発生することがある。この場合sizeofは、アラインメントの倍数に切り上げた値を返すことが規格で認められている。
 単純な整数型変数であっても実装によっては特殊なサイズを持ち、かつアラインメントが発生する事がある。従って、sizeofの値にCHAR_BITを掛けて変数の有効ビット長を得ることは、移植性を考えると不可能ということになる。

C#
 C#では、予約語の一つである。
 結果はint型で返される。

Delphi
 Delphiでは、関数の一つとして定義されている。
 function SizeOf(var X: type): Integer;
 結果はInteger型で返される。

再検索