std:: size_t
|
Défini dans l'en-tête
<cstddef>
|
||
|
Défini dans l'en-tête
<cstdio>
|
||
|
Défini dans l'en-tête
<cstdlib>
|
||
|
Défini dans l'en-tête
<cstring>
|
||
|
Défini dans l'en-tête
<ctime>
|
||
|
Défini dans l'en-tête
<cuchar>
|
(depuis C++17)
|
|
|
Défini dans l'en-tête
<cwchar>
|
||
|
typedef
/* implementation-defined */
size_t
;
|
||
std::size_t
est le type entier non signé du résultat des opérateurs suivants :
| (depuis C++11) |
Si un programme tente de former un type de taille excessive (c'est-à-dire que le nombre d'octets dans sa
représentation d'objet
dépasse la valeur maximale représentable dans
std::size_t
), le programme est mal formé.
|
La largeur en bits de
|
(depuis C++11) |
Table des matières |
Notes
std::size_t
peut stocker la taille maximale d'un objet théoriquement possible de n'importe quel type (y compris les tableaux). Sur de nombreuses plateformes (à l'exception des systèmes avec adressage segmenté)
std::size_t
peut stocker en toute sécurité la valeur de n'importe quel pointeur non-membre, auquel cas il est synonyme de
std::uintptr_t
.
std::size_t
est couramment utilisé pour l'indexation de tableaux et le comptage de boucles. Les programmes qui utilisent d'autres types, tels que
unsigned
int
, pour l'indexation de tableaux peuvent échouer, par exemple sur des systèmes 64 bits lorsque l'index dépasse
UINT_MAX
ou s'il repose sur une arithmétique modulaire 32 bits.
Lors de l'indexation des conteneurs C++, tels que
std::string
,
std::vector
, etc., le type approprié est le type imbriqué
size_type
fourni par ces conteneurs. Il est généralement défini comme un synonyme de
std::size_t
.
Il n'est pas spécifié si la déclaration de
std::size_t
est disponible dans tout autre en-tête de la bibliothèque standard. Une implémentation peut éviter d'introduire ce nom même lorsque la norme exige l'utilisation de
std::size_t
.
|
Le
suffixe littéral entier
pour
|
(depuis C++23) |
Implémentation possible
using size_t = decltype ( sizeof 0 ) ;
Exemple
#include <array> #include <cstddef> #include <iostream> int main() { std::array<std::size_t, 10> a; // Exemple avec le littéral std::size_t de C++23 for (auto i = 0uz; i != a.size(); ++i) std::cout << (a[i] = i) << ' '; std::cout << '\n'; // Exemple de boucle de décrémentation for (std::size_t i = a.size(); i--;) std::cout << a[i] << ' '; std::cout << '\n'; // Notez que la boucle de décrémentation naïve : // for (std::size_t i = a.size() - 1; i >= 0; --i) ... // est une boucle infinie, car les nombres non signés sont toujours non négatifs }
Sortie :
0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | S'applique à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| CWG 1122 | C++98 |
std::size_t
était défini de manière circulaire
[1]
|
sa définition est laissée à l'implémentation |
| CWG 1464 | C++98 |
la taille d'un objet pouvait ne pas être représentable dans
std::size_t
|
un tel type est non conforme |
-
↑
La définition de
std::size_tétait exactement la même que la définition desize_ten C, qui est « le type résultant de sizeof ». Il n'y a pas de définition circulaire en C car le type résultant desizeofen C est un type entier non signé défini par l'implémentation.
Références
- Norme C++23 (ISO/CEI 14882:2024) :
-
- 6.8.4 Types composés [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 Tailles, alignements et décalages [support.types.layout] (p. 504-505)
- Norme C++20 (ISO/CEI 14882:2020) :
-
- 6.8.3 Types composés [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 Tailles, alignements et décalages [support.types.layout] (p : 507-508)
- Norme C++17 (ISO/CEI 14882:2017) :
-
- 6.9.2 Types composés [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 Tailles, alignements et décalages [support.types.layout] (p: 479)
- Norme C++14 (ISO/CEI 14882:2014) :
-
- 3.9.2 Types composés [basic.compound] (p. 73-74)
-
- 5.3.3 Sizeof [expr.sizeof] (p. 109-110)
-
- 5.3.6 Alignof [expr.alignof] (p. 116)
-
- 18.2 Types [support.types] (p. 443-444)
- Norme C++11 (ISO/CEI 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)
- Norme C++03 (ISO/CEI 14882:2003) :
-
- 5.3.3 Sizeof [expr.sizeof] (p: 79)
- Norme C++98 (ISO/CEI 14882:1998) :
-
- 5.3.3 Sizeof [expr.sizeof] (p: 77)
Voir aussi
|
type entier signé renvoyé lors de la soustraction de deux pointeurs
(typedef) |
|
|
décalage en octets depuis le début d'un type
standard-layout
jusqu'au membre spécifié
(macro fonction) |
|
| littéraux entiers | binaire, (depuis C++14) nombres décimaux, octaux ou hexadécimaux de type entier |
|
documentation C
pour
size_t
|
|