Namespaces
Variants

std:: size_t

From cppreference.net
Utilities library
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 std::size_t n'est pas inférieure à 16.

(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 std::size_t est toute combinaison de z ou Z avec u ou U (c'est-à-dire zu , zU , Zu , ZU , uz , uZ , Uz , ou UZ ).

(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
  1. La définition de std::size_t était exactement la même que la définition de size_t en 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 de sizeof en 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