sizeof
operator
オブジェクトまたは型のサイズを問い合わせます。
オブジェクトの実際のサイズを知る必要がある場合に使用されます。
目次 |
構文
sizeof(
type
)
|
(1) | ||||||||
sizeof
expression
|
(2) | ||||||||
| type | - | 型 type-id ( 型名付け を参照) |
| expression | - |
演算子の優先順位
が
sizeof
よりも低くない式(例:
sizeof a
+
b
は
(
sizeof a
)
+
b
として解析され、
sizeof
(
a
+
b
)
とはならない)
|
sizeof
式の結果は、
定数式
であり、型は
std::size_t
です。
注記
コンピュータアーキテクチャに依存して、 byte は8ビット以上で構成される場合があり、正確な数値は CHAR_BIT に記録されています。
以下の
sizeof
式は常に
1
と評価されます:
- sizeof ( char )
- sizeof ( signed char )
- sizeof ( unsigned char )
|
(C++17以降) |
|
(C++20以降) |
sizeof
は関数型、不完全型、またはビットフィールドの
lvalues
(C++11まで)
glvalues
(C++11以降)
に対して使用できません。
参照型に適用された場合、結果は参照先の型のサイズとなります。
クラス型に適用された場合、その結果は、そのクラスの完全なオブジェクトが占めるバイト数であり、そのようなオブジェクトを配列内に配置するために必要な追加のパディングも含みます。 潜在的にオーバーラップするサブオブジェクト が占めるバイト数は、そのオブジェクトのサイズよりも小さい場合があります。
sizeof
の結果は、空のクラス型に適用された場合でも常にゼロではありません。
式に適用される場合、
sizeof
は
式を評価しません
(つまり、式は未評価オペランドです)
(C++11以降)
。また、式が多態性オブジェクトを指定する場合でも、結果は式の静的な型のサイズとなります。左辺値から右辺値への変換、配列からポインタへの変換、または関数からポインタへの変換は行われません。
一時オブジェクトの実体化
は、しかしながら、(形式的に)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(); // 戻り値の型はEmptyだが、常に1をスローする auto println = [](auto rem, std::size_t size) { std::cout << rem << size << '\n'; }; println( "1) 空クラスのsizeof: ", sizeof e ); println( "2) ポインタのsizeof: ", sizeof &e ); println( "3) Bitクラスのsizeof: ", sizeof(Bit) ); println( "4) int[10] 10個のint配列のsizeof: ", sizeof(int[10]) ); println( "5) a 10個のint配列のsizeof: ", sizeof a ); println( "6) 10個のint配列の長さ: ", ((sizeof a) / (sizeof *a)) ); println( "7) 10個のint配列の長さ(2): ", ((sizeof a) / (sizeof a[0])) ); println( "8) Derivedクラスのsizeof: ", sizeof d ); println( "9) Base経由のDerivedのsizeof: ", sizeof b ); println( "A) unsignedのsizeof: ", sizeof(unsigned) ); println( "B) intのsizeof: ", sizeof(int) ); println( "C) shortのsizeof: ", sizeof(short) ); println( "D) charのsizeof: ", sizeof(char) ); println( "E) CharCharのsizeof: ", sizeof(CharChar) ); println( "F) CharCharIntのsizeof: ", sizeof(CharCharInt) ); println( "G) IntCharCharのsizeof: ", sizeof(IntCharChar) ); println( "H) CharIntCharのsizeof: ", sizeof(CharIntChar) ); println( "I) CharShortCharのsizeof: ", sizeof(CharShortChar) ); println( "J) f()のsizeof: ", sizeof f() ); println( "K) Base::aのsizeof: ", sizeof Base::a ); // println( "関数のsizeof: ", sizeof(void()) ); // エラー // println( "不完全型のsizeof: ", sizeof(int[]) ); // エラー // println( "ビットフィールドのsizeof: ", sizeof bit.bit ); // エラー }
出力例:
1) 空クラスの sizeof: 1 2) ポインタの sizeof: 8 3) Bitクラスの sizeof: 4 4) int[10]配列の sizeof: 40 5) 10個のint配列の sizeof: 40 6) 10個のint配列の長さ: 10 7) 10個のint配列の長さ (2): 10 8) Derivedクラスの sizeof: 8 9) Base経由でのDerivedの sizeof: 4 A) unsignedの sizeof: 4 B) intの sizeof: 4 C) shortの sizeof: 2 D) charの sizeof: 1 E) CharCharの sizeof: 2 F) CharCharIntの sizeof: 8 G) IntCharCharの sizeof: 8 H) CharIntCharの sizeof: 12 I) CharShortCharの sizeof: 6 J) f()の sizeof: 1 K) Base::aの sizeof: 4
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| CWG 1553 | C++11 |
sizeof
がビットフィールドのxvaluesで使用可能だった
|
禁止 |
関連項目
alignof
(C++11)
|
型のアライメント要件を問い合わせる
(演算子) |
sizeof...
演算子
(C++11)
|
パック 内の要素数を問い合わせる |
|
すべての基本数値型のプロパティを問い合わせるためのインターフェースを提供する
(クラステンプレート) |
|
|
Cドキュメント
for
sizeof
|
|