Namespaces
Variants

std:: size_t

From cppreference.net
Utilities library
定義先ヘッダ <cstddef>
定義先ヘッダ <cstdio>
定義先ヘッダ <cstdlib>
定義先ヘッダ <cstring>
定義先ヘッダ <ctime>
定義先ヘッダ <cuchar>
(C++17以降)
定義先ヘッダ <cwchar>
typedef /* implementation-defined */ size_t ;

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

(C++11以降)

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

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以降)

実装例

using size_t = decltype ( sizeof 0 ) ;

#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進数の整数型の数値