std:: size_t
|
定義先ヘッダ
<cstddef>
|
||
|
定義先ヘッダ
<cstdio>
|
||
|
定義先ヘッダ
<cstdlib>
|
||
|
定義先ヘッダ
<cstring>
|
||
|
定義先ヘッダ
<ctime>
|
||
|
定義先ヘッダ
<cuchar>
|
(C++17以降)
|
|
|
定義先ヘッダ
<cwchar>
|
||
|
typedef
/* implementation-defined */
size_t
;
|
||
std::size_t
は以下の演算子の結果の符号なし整数型です:
| (C++11以降) |
プログラムが過大な型を形成しようとする場合(つまり、その
オブジェクト表現
のバイト数が
std::size_t
で表現可能な最大値を超える場合)、プログラムは不適格となります。
|
|
(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
の使用を要求する場合であっても、この名前を導入しないことを選択できます。
|
整数リテラルサフィックス
で
|
(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
で表現できない可能性があった
|
そのような型は不適格である |
-
↑
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進数の整数型の数値 |
|
Cドキュメント
for
size_t
|
|