sizeof 演算子
オブジェクトまたは型のサイズを照会します。
オブジェクトの実際のサイズを知る必要がある場合に使用されます。
目次 |
[編集] 構文
sizeof( 型 ) |
(1) | ||||||||
sizeof 式 |
(2) | ||||||||
| type | - | 型ID (型命名を参照) |
| 式 | - | 演算子優先順位がsizeofより低くない式 (例: sizeof a + bは(sizeof a) + bとして解析され、sizeof (a + b)としては解析されません) |
sizeof式の結果は、std::size_t型の定数式です。
[編集] 注記
コンピュータアーキテクチャによっては、バイトは8ビット以上で構成される場合があり、正確な数はCHAR_BITに記録されています。
以下のsizeof式は常に1と評価されます。
- sizeof(char)
- sizeof(signed char)
- sizeof(unsigned char)
|
(C++17以降) |
|
(C++20以降) |
sizeofは、関数型、不完全型、またはビットフィールドlvalue(C++11まで)glvalue(C++11以降)では使用できません。
参照型に適用された場合、結果は参照される型のサイズになります。
クラス型に適用された場合、結果は、配列にそのオブジェクトを配置するために必要な追加のパディングを含め、そのクラスの完全なオブジェクトが占めるバイト数になります。潜在的にオーバーラップするサブオブジェクトが占めるバイト数は、そのオブジェクトのサイズよりも小さい場合があります。
sizeofの結果は、空のクラス型に適用された場合でも、常に非ゼロです。
式に適用された場合、sizeofは式を評価しません (つまり、式は評価されないオペランドです)(C++11以降)。また、式がポリモーフィックオブジェクトを指す場合でも、結果は式の静的型のサイズになります。Lvalueからrvalueへの変換、配列からポインタへの変換、または関数からポインタへの変換は実行されません。ただし、prvalue引数に対しては一時的な具体化が(形式的に)実行されます。引数が破棄可能でない場合、プログラムは不適切です。(C++17以降)
[編集] キーワード
[編集] 例
この例の出力は、64ビットポインタと32ビットint(別名LP64またはLLP64)を持つシステムに対応しています。
#include <cstdlib> #include <iostream> struct Empty { }; struct Base { int a; }; struct Derived : Base { int b; }; struct Bit { unsigned bit: 1; }; struct CharChar { char c; char c2; }; struct CharCharInt { char c; char c2; int i; }; struct IntCharChar { int i; char c; char c2; }; struct CharIntChar { char c; int i; char c2; }; struct CharShortChar { char c; short s; char c2; }; int main() { Empty e; Derived d; Base& b = d; [[maybe_unused]] Bit bit; int a[10]; auto f = [&]() { return sizeof(int[10]) == sizeof a ? throw 1 : e; }; // f(); // the return type is Empty, but always throws 1 auto println = [](auto rem, std::size_t size) { std::cout << rem << size << '\n'; }; println( "1) sizeof empty class: ", sizeof e ); println( "2) sizeof pointer: ", sizeof &e ); println( "3) sizeof(Bit) class: ", sizeof(Bit) ); println( "4) sizeof(int[10]) array of 10 int: ", sizeof(int[10]) ); println( "5) sizeof a array of 10 int: ", sizeof a ); println( "6) length of array of 10 int: ", ((sizeof a) / (sizeof *a)) ); println( "7) length of array of 10 int (2): ", ((sizeof a) / (sizeof a[0])) ); println( "8) sizeof the Derived class: ", sizeof d ); println( "9) sizeof the Derived through Base: ", sizeof b ); println( "A) sizeof(unsigned): ", sizeof(unsigned) ); println( "B) sizeof(int): ", sizeof(int) ); println( "C) sizeof(short): ", sizeof(short) ); println( "D) sizeof(char): ", sizeof(char) ); println( "E) sizeof(CharChar): ", sizeof(CharChar) ); println( "F) sizeof(CharCharInt): ", sizeof(CharCharInt) ); println( "G) sizeof(IntCharChar): ", sizeof(IntCharChar) ); println( "H) sizeof(CharIntChar): ", sizeof(CharIntChar) ); println( "I) sizeof(CharShortChar): ", sizeof(CharShortChar) ); println( "J) sizeof f(): ", sizeof f() ); println( "K) sizeof Base::a: ", sizeof Base::a ); // println( "sizeof function: ", sizeof(void()) ); // error // println( "sizeof incomplete type: ", sizeof(int[]) ); // error // println( "sizeof bit-field: ", sizeof bit.bit ); // error }
実行結果の例
1) sizeof empty class: 1 2) sizeof pointer: 8 3) sizeof(Bit) class: 4 4) sizeof(int[10]) array of 10 int: 40 5) sizeof a array of 10 int: 40 6) length of array of 10 int: 10 7) length of array of 10 int (2): 10 8) sizeof the Derived class: 8 9) sizeof the Derived through Base: 4 A) sizeof(unsigned): 4 B) sizeof(int): 4 C) sizeof(short): 2 D) sizeof(char): 1 E) sizeof(CharChar): 2 F) sizeof(CharCharInt): 8 G) sizeof(IntCharChar): 8 H) sizeof(CharIntChar): 12 I) sizeof(CharShortChar): 6 J) sizeof f(): 1 K) sizeof Base::a: 4
[編集] 欠陥レポート
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| CWG 1553 | C++11 | sizeofはビットフィールドxvalueで使用できます。 |
禁止された |
[編集] 関連項目
alignof (C++11) |
型のアライメント要件を問い合わせる (演算子) |
sizeof...演算子 (C++11) |
パック内の要素数を照会します |
| 全ての基本数値型のプロパティを問い合わせるインターフェースを提供する (クラステンプレート) | |
| sizeofのCドキュメント
| |