Namespaces
Variants

std::size_t

ja.cppreference.net から
< cpp | 型
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
swap と 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
ヘッダ <cstddef>
で定義<cstdio>
ヘッダ <cstdlib>
で定義<cstring>
ヘッダ <ctime>
で定義<cuchar>
(C++17 以降)
ヘッダ <cwchar>
typedef /* implementation-defined */ size_t;

std::size_tは、以下の演算子の結果の符号なし整数型です:

(C++11 以降)

プログラムが過大な型(つまり、そのオブジェクト表現のバイト数が std::size_t で表現可能な最大値を超えるもの)を形成しようとすると、そのプログラムは ill-formed です。

std::size_t のビット幅は 16 未満ではありません。

(C++11 以降)

注記

std::size_t は、理論上可能なあらゆる型(配列を含む)のオブジェクトの最大サイズを格納できます。多くのプラットフォームでは(セグメント方式のアドレス指定を使用するシステムは例外)、 std::size_t は非メンバーポインタの値を安全に格納でき、その場合は std::uintptr_t と同義となります。

std::size_t は配列のインデックス指定やループカウントによく使用されます。 unsigned int のような他の型を配列インデックスに使用するプログラムは、例えば64ビットシステムでインデックスが UINT_MAX を超える場合や、32ビットのモジュラー演算に依存している場合に失敗する可能性があります。

C++コンテナ(例: std::string 、 std::vector など)をインデックスする際に適切な型は、そのコンテナが提供するネスト型 size_type です。これは通常 std::size_t のシノニムとして定義されます。

std::size_tの宣言が他の標準ライブラリヘッダで利用可能かどうかは未規定です。実装は、規格がstd::size_tの使用を要求する場合であっても、この名前を導入しないことを選択できます。

整数リテラルサフィックス で std::size_t を表すものは、 z または Z と u または U の任意の組み合わせである (すなわち zu , zU , Zu , ZU , uz , uZ , Uz , または UZ )。

(C++23以降)

例

#include <array>
#include <cstddef>
#include <iostream>
int main()
{
    std::array<std::size_t, 10> a;
    // C++23 std::size_t リテラルの使用例
    for (auto i = 0uz; i != a.size(); ++i)
        std::cout << (a[i] = i) << ' ';
    std::cout << '\n';
    // デクリメントループの例
    for (std::size_t i = a.size(); i--;)
        std::cout << a[i] << ' ';
    std::cout << '\n';
    // 単純なデクリメントループ:
    //  for (std::size_t i = a.size() - 1; i >= 0; --i) ...
    // は無限ループとなる。符号なし整数は常に非負であるため
}

出力:

0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
CWG 1122 C++98 std::size_t は循環定義されていた [1] 実装定義である
CWG 1464 C++98 オブジェクトサイズが std::size_t で表現できない可能性があった そのような型は不適格である
  1. ↑ std::size_tの定義は、C言語におけるsize_tの定義と完全に同一であり、それは「 sizeof 演算子の結果の型」である。C言語では循環定義は存在しない。なぜなら、C言語におけるsizeof演算子の結果の型は実装定義の符号なし整数型であるためである。

参考文献

  • C++23規格 (ISO/IEC 14882:2024):
  • 6.8.4 複合型 [basic.compound] (p: 79-80)
  • 7.6.2.5 Sizeof [expr.sizeof] (p: 136)
  • 7.6.2.6 Alignof [expr.alignof] (p: 136)
  • 17.2.4 サイズ、アライメント、オフセット [support.types.layout] (p: 504-505)
  • C++20規格 (ISO/IEC 14882:2020):
  • 6.8.3 複合型 [basic.compound] (p: 75-76)
  • 7.6.2.5 Sizeof演算子 [expr.sizeof] (p: 129-130)
  • 7.6.2.6 Alignof演算子 [expr.alignof] (p: 130)
  • 17.2.4 サイズ、アライメント、オフセット [support.types.layout] (p: 507-508)
  • C++17規格 (ISO/IEC 14882:2017):
  • 6.9.2 複合型 [basic.compound] (p: 81-82)
  • 8.3.3 Sizeof [expr.sizeof] (p: 121-122)
  • 8.3.6 Alignof [expr.alignof] (p: 129)
  • 21.2.4 サイズ、アライメント、オフセット [support.types.layout] (p: 479)
  • C++14標準 (ISO/IEC 14882:2014):
  • 3.9.2 複合型 [basic.compound] (p: 73-74)
  • 5.3.3 Sizeof [expr.sizeof] (p: 109-110)
  • 5.3.6 Alignof [expr.alignof] (p: 116)
  • 18.2 型 [support.types] (p: 443-444)
  • C++11標準 (ISO/IEC 14882:2011):
  • 5.3.3 Sizeof [expr.sizeof] (p: 111)
  • 5.3.6 Alignof [expr.alignof] (p: 116)
  • 18.2 Types [support.types] (p: 454-455)
  • C++03標準 (ISO/IEC 14882:2003):
  • 5.3.3 Sizeof [expr.sizeof] (p: 79)
  • C++98 標準 (ISO/IEC 14882:1998):
  • 5.3.3 Sizeof [expr.sizeof] (p: 77)

関連項目

2つのポインタを減算したときに返される符号付き整数型
(typedef)
標準レイアウト型 の先頭から指定されたメンバーまでのバイトオフセット
(関数マクロ)
整数リテラル 2進数、 (C++14以降) 10進数、8進数、または16進数の整数型の数値