sizeof 演算子は、オペランドのサイズをバイト で生成します 。オペランドは式、または型の括弧付きの名前とすることができます。sizeof 式の形式は、次のとおりです。
>>-sizeof--+-expr------------+--------------------------------->< '-(--type-name--)-'
いずれのタイプのオペランドについても結果は左辺値ではなく、定数整数値です。結果の型は、stddef.h ヘッダー・ファイルに定義された符号なし整数型 size_t です。
型名に適用された sizeof 演算子は、その型のオブジェクトによって使用されるメモリー量 (内部または末尾の埋め込みを含む) を結果として出します。3 種類の char オブジェクト (unsigned、signed、またはプレーン) は、いずれもサイズがバイト 1 となります。 オペランドが可変長配列型の場合は、そのオペランドが評価されます。 sizeof 演算子を次の項目に適用することはできません。
式に適用された sizeof 演算子は、式の型の名前にのみ適用された場合と同じ結果を出します。 コンパイル時に、コンパイラーは式を分析してその型を判別しますが、評価は行いません。式の型の分析で行われる通常の型変換は、いずれも sizeof 式に直接 付随するものではありません。ただし、オペランドに型変換を行う演算子が含まれている場合は、コンパイラーはこれらの型変換を考慮して型を判別します。
以下の例の 2 行目では、通常の算術変換を行います。short は 2 バイトのストレージを使用し、int は 4 バイト使用しています。
short x; ... sizeof (x) /* the value of sizeof operator is 2 */ short x; ... sizeof (x + 1) /* value is 4, result of addition is type int */
式 x + 1 の結果は int 型で、sizeof(int) と同じです 。 値は、x に char、short、または int 型、あるいは任意 の列挙型を 指定する場合も 4 です。
型は、sizeof 式では定義できません。
以下の例では、コンパイラーは、コンパイル時にサイズを評価することができます。sizeof のオペランド (式) は評価されません。b の値は、 初期化からプログラム実行時の終了まで、整数定数 5 です。
#include <stdio.h> int main(void){ int b = 5; sizeof(b++); return 0; }
プリプロセッサー・ディレクティブの中以外では、整数定数が必要なときは、sizeof 式 を使用できます。 sizeof 演算子がよく使われる 1 つの例は、ストレージ割り振り時、入力関数、および出 力関数で 参照されるオブジェクトのサイズを決める場合です。
もう 1 つの sizeof の使い方は、プラットフォームをまたがってコードを移植する場合 です。 データ型が表すサイズを決めるために、sizeof 演算子を使用します。次に例を示します。
sizeof(int);
sizeof 演算子のオペランドは、AltiVec 言語拡張機能が使用可能になっていれば、ベクトル型、
またはベクトル型へのポインターの間接参照の結果である可能性があります。
このような場合、sizeof の戻り値は常に 16 です。
vector bool int v1; vector bool int *pv1 = &v1; sizeof(v1); // vector type: 16. sizeof(&v1); // address of vector: 4. sizeof(*pv1); // dereferenced pointer to vector: 16. sizeof(pv1); // pointer to vector: 4. sizeof(vector bool int); // vector type: 16.
sizeof 式の結果は、それが適用される型によって異なります。
オペランド | 結果 |
---|---|
配列 | 結果は、配列内のバイトの合計数になります。 例えば、10 のエレメントがある配列では、サイズは、単一のエレメントのサイズの 10 倍になりま す。 コンパイラーは、式を評価する前には、配列をポインターに変換しません。 |
![]() | 結果は常に非ゼロで、そのクラスのオブジェクトのバイト数になります (配列にクラス・オブジェクトを 配置するために必要な埋め込みを含む)。 |
![]() | 結果は、参照されるオブジェクトのサイズになります。 |
関連参照