Namespaces
Variants

std:: size_t

From cppreference.net
Utilities library
Definido en el encabezado <cstddef>
Definido en el encabezado <cstdio>
Definido en el encabezado <cstdlib>
Definido en el encabezado <cstring>
Definido en el encabezado <ctime>
Definido en el encabezado <cuchar>
(desde C++17)
Definido en el encabezado <cwchar>
typedef /* implementation-defined */ size_t ;

std::size_t es el tipo entero sin signo del resultado de los siguientes operadores:

(desde C++11)

Si un programa intenta formar un tipo de tamaño excesivo (es decir, el número de bytes en su object representation excede el valor máximo representable en std::size_t ), el programa está mal formado.

El ancho en bits de std::size_t no es menor que 16.

(since C++11)

Contenidos

Notas

std::size_t puede almacenar el tamaño máximo de un objeto teóricamente posible de cualquier tipo (incluyendo arreglos). En muchas plataformas (una excepción son los sistemas con direccionamiento segmentado) std::size_t puede almacenar de forma segura el valor de cualquier puntero que no sea miembro, en cuyo caso es sinónimo de std::uintptr_t .

std::size_t se utiliza comúnmente para indexación de arreglos y conteo de bucles. Los programas que utilizan otros tipos, como unsigned int , para indexación de arreglos pueden fallar en, por ejemplo, sistemas de 64 bits cuando el índice excede UINT_MAX o si depende de aritmética modular de 32 bits.

Al indexar contenedores de C++, como std::string , std::vector , etc., el tipo apropiado es el tipo anidado size_type proporcionado por dichos contenedores. Normalmente se define como un sinónimo de std::size_t .

No está especificado si la declaración de std::size_t está disponible en cualquier otro encabezado de la biblioteca estándar. Una implementación puede evitar introducir este nombre incluso cuando el estándar requiere std::size_t que sea utilizado.

El sufijo de literal entero para std::size_t es cualquier combinación de z o Z con u o U (es decir, zu , zU , Zu , ZU , uz , uZ , Uz , o UZ ).

(desde C++23)

Implementación posible

using size_t = decltype ( sizeof 0 ) ;

Ejemplo

#include <array>
#include <cstddef>
#include <iostream>
int main()
{
    std::array<std::size_t, 10> a;
    // Ejemplo con literal std::size_t de C++23
    for (auto i = 0uz; i != a.size(); ++i)
        std::cout << (a[i] = i) << ' ';
    std::cout << '\n';
    // Ejemplo de bucle decremental
    for (std::size_t i = a.size(); i--;)
        std::cout << a[i] << ' ';
    std::cout << '\n';
    // Nótese que el bucle decremental ingenuo:
    //  for (std::size_t i = a.size() - 1; i >= 0; --i) ...
    // es un bucle infinito, porque los números sin signo son siempre no negativos
}

Salida:

0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
CWG 1122 C++98 std::size_t se definía circularmente [1] está definido por la implementación
CWG 1464 C++98 el tamaño del objeto podría no ser representable en std::size_t dicho tipo está mal formado
  1. La definición de std::size_t era exactamente igual a la definición de size_t en C, que es "el tipo de resultado de sizeof ". No hay una definición circular en C porque el tipo de resultado de sizeof en C es un tipo entero sin signo definido por la implementación.

Referencias

  • Estándar C++23 (ISO/IEC 14882:2024):
  • 6.8.4 Tipos compuestos [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 Tamaños, alineaciones y desplazamientos [support.types.layout] (p: 504-505)
  • Estándar C++20 (ISO/IEC 14882:2020):
  • 6.8.3 Tipos compuestos [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 Tamaños, alineaciones y desplazamientos [support.types.layout] (p: 507-508)
  • Estándar C++17 (ISO/IEC 14882:2017):
  • 6.9.2 Tipos compuestos [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 Tamaños, alineaciones y desplazamientos [support.types.layout] (p: 479)
  • Estándar C++14 (ISO/IEC 14882:2014):
  • 3.9.2 Tipos compuestos [basic.compound] (p: 73-74)
  • 5.3.3 Sizeof [expr.sizeof] (p: 109-110)
  • 5.3.6 Alignof [expr.alignof] (p: 116)
  • 18.2 Tipos [support.types] (p: 443-444)
  • Estándar 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)
  • Estándar C++03 (ISO/IEC 14882:2003):
  • 5.3.3 Sizeof [expr.sizeof] (p: 79)
  • Estándar C++98 (ISO/IEC 14882:1998):
  • 5.3.3 Sizeof [expr.sizeof] (p: 77)

Véase también

tipo entero con signo devuelto al restar dos punteros
(typedef)
desplazamiento en bytes desde el inicio de un tipo de diseño estándar hasta el miembro especificado
(macro de función)
literales enteros binarios, (desde C++14) números decimales, octales o hexadecimales de tipo entero