std:: size_t
|
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
|
(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
|
(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 |
-
↑
La definición de
std::size_tera exactamente igual a la definición desize_ten C, que es "el tipo de resultado de sizeof ". No hay una definición circular en C porque el tipo de resultado desizeofen 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 |
|
Documentación de C
para
size_t
|
|