Namespaces
Variants

sizeof operator

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

オブジェクトまたは型のサイズを問い合わせます。

オブジェクトの実際のサイズを知る必要がある場合に使用されます。

目次

構文

sizeof( type ) (1)
sizeof expression (2)
1) type オブジェクト表現 のサイズをバイト単位で返します。
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 )
(注:指定された条件により、HTMLタグ内のC++コードは翻訳対象外のため、元のテキストを保持しています)
(C++17以降)
  • sizeof ( char8_t )
(C++20以降)

sizeof は関数型、不完全型、またはビットフィールドの lvalues (C++11まで) glvalues (C++11以降) に対して使用できません。

参照型に適用された場合、結果は参照先の型のサイズとなります。

クラス型に適用された場合、その結果は、そのクラスの完全なオブジェクトが占めるバイト数であり、そのようなオブジェクトを配列内に配置するために必要な追加のパディングも含みます。 潜在的にオーバーラップするサブオブジェクト が占めるバイト数は、そのオブジェクトのサイズよりも小さい場合があります。

sizeof の結果は、空のクラス型に適用された場合でも常にゼロではありません。

式に適用される場合、 sizeof 式を評価しません (つまり、式は未評価オペランドです) (C++11以降) 。また、式が多態性オブジェクトを指定する場合でも、結果は式の静的な型のサイズとなります。左辺値から右辺値への変換、配列からポインタへの変換、または関数からポインタへの変換は行われません。 一時オブジェクトの実体化 は、しかしながら、(形式的に)prvalue引数に対して実行されます:引数が破棄可能でない場合、プログラムは不適格です。 (C++17以降)

キーワード

sizeof

この出力例は、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) パック 内の要素数を問い合わせる
すべての基本数値型のプロパティを問い合わせるためのインターフェースを提供する
(クラステンプレート)