sizeof 演算子

sizeof 演算子は、オペランドのサイズをバイト で生成します 。オペランドは式、または型の括弧付きの名前とすることができます。sizeof 式の形式は、次のとおりです。

>>-sizeof--+-expr------------+---------------------------------><
           '-(--type-name--)-'
 
 

いずれのタイプのオペランドについても結果は左辺値ではなく、定数整数値です。結果の型は、stddef.h ヘッダー・ファイルに定義された符号なし整数型 size_t です。

型名に適用された sizeof 演算子は、その型のオブジェクトによって使用されるメモリー量 (内部または末尾の埋め込みを含む) を結果として出します。3 種類の char オブジェクト (unsignedsigned、またはプレーン) は、いずれもサイズがバイト 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) と同じです 。 値は、xcharshort、または 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);

Linux Mac OS X C のみ 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 倍になりま す。 コンパイラーは、式を評価する前には、配列をポインターに変換しません。
C++クラス
結果は常に非ゼロで、そのクラスのオブジェクトのバイト数になります (配列にクラス・オブジェクトを 配置するために必要な埋め込みを含む)。
C++参照
結果は、参照されるオブジェクトのサイズになります。

関連参照

IBM Copyright 2003