std::size_t
| ヘッダ <cstddef> で定義 |
||
| ヘッダ <cstdio>で定義 |
||
| ヘッダ <cstdlib> で定義 |
||
| ヘッダー <cstring> で定義 |
||
| ヘッダ <ctime> で定義 |
||
| ヘッダー <cuchar> で定義 |
(C++17以降) |
|
| ヘッダ <cwchar> で定義 |
||
| typedef /* 実装定義 */ 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ビットの剰余演算に依存したりすると失敗する可能性があります。
std::string、std::vectorなどのC++コンテナをインデックス付けする場合、適切な型は、そのようなコンテナによって提供されるネストされた型size_typeです。これは通常、std::size_tの同義語として定義されます。
std::size_tの宣言が他の標準ライブラリヘッダで利用可能であるかどうかは未指定です。実装は、標準がstd::size_tの使用を要求している場合でも、この名前の導入を避けることができます。
|
|
(C++23から) |
[編集] 例
#include <array> #include <cstddef> #include <iostream> int main() { std::array<std::size_t, 10> a; // Example with C++23 std::size_t literal for (auto i = 0uz; i != a.size(); ++i) std::cout << (a[i] = i) << ' '; std::cout << '\n'; // Example of decrementing loop for (std::size_t i = a.size(); i--;) std::cout << a[i] << ' '; std::cout << '\n'; // Note the naive decrementing loop: // for (std::size_t i = a.size() - 1; i >= 0; --i) ... // is an infinite loop, because unsigned numbers are always non-negative }
出力
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では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 standard (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 standard (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 standard (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 standard (ISO/IEC 14882:2011)
- 5.3.3 Sizeof [expr.sizeof] (p: 111)
- 5.3.6 Alignof [expr.alignof] (p: 116)
- 18.2 型 [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ドキュメント size_t
| |