std::size_t
Определён в заголовочном файле <cstddef> | ||
|---|---|---|
Определён в заголовочном файле <cstdio> | ||
Определён в заголовочном файле <cstdlib> | ||
Определён в заголовочном файле <cstring> | ||
Определён в заголовочном файле <ctime> | ||
Определён в заголовочном файле <cuchar> | (начиная с C++17) | |
Определён в заголовочном файле <cwchar> | ||
typedef /* implementation-defined */ size_t; |
std::size_t — это беззнаковый целочисленный тип результата следующих операторов:
| (начиная с C++11) |
Если программа пытается создать тип слишком большого размера (то есть количество байтов в его представлении объекта превышает максимальное значение, представимое в std::size_t), программа некорректна.
| Разрядность | (начиная с C++11) |
Примечания
std::size_t может хранить максимальный размер теоретически возможного объекта любого типа (включая массив). На многих платформах (исключение составляют системы с сегментированной адресацией) std::size_t может безопасно хранить значение любого указателя, не являющегося указателем на член, и в таком случае он является синонимом std::uintptr_t.
std::size_t обычно используется для индексации массивов и подсчёта итераций циклов. Программы, в которых для индексации массивов используются другие типы, например unsignedint, могут работать некорректно, например, в 64-разрядных системах, если индекс превышает UINT_MAX или если программа полагается на 32-разрядную модульную арифметику.
При индексации контейнеров C++, таких как std::string, std::vector и т. д., следует использовать вложенный тип 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было в точности таким же, как определениеsize_tв C: «тип результатаsizeof». В C циклического определения нет, поскольку тип результатаsizeofв C — это беззнаковый целочисленный тип, определяемый реализацией.
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
- 6.8.4 Составные типы [basic.compound] (с. 79–80)
- 7.6.2.5 Sizeof [expr.sizeof] (с. 136)
- 7.6.2.6 Alignof [expr.alignof] (с. 136)
- 17.2.4 Размеры, выравнивания и смещения [support.types.layout] (с. 504–505)
- Стандарт C++20 (ISO/IEC 14882:2020):
- 6.8.3 Составные типы [basic.compound] (с. 75–76)
- 7.6.2.5 Sizeof [expr.sizeof] (с. 129–130)
- 7.6.2.6 Alignof [expr.alignof] (с. 130)
- 17.2.4 Размеры, выравнивания и смещения [support.types.layout] (с. 507–508)
- Стандарт C++17 (ISO/IEC 14882:2017):
- 6.9.2 Составные типы [basic.compound] (с. 81–82)
- 8.3.3 Sizeof [expr.sizeof] (с. 121–122)
- 8.3.6 Alignof [expr.alignof] (с. 129)
- 21.2.4 Размеры, выравнивания и смещения [support.types.layout] (с. 479)
- Стандарт C++14 (ISO/IEC 14882:2014):
- 3.9.2 Составные типы [basic.compound] (с. 73–74)
- 5.3.3 Sizeof [expr.sizeof] (с. 109–110)
- 5.3.6 Alignof [expr.alignof] (с. 116)
- 18.2 Типы [support.types] (с. 443–444)
- Стандарт C++11 (ISO/IEC 14882:2011):
- 5.3.3 Sizeof [expr.sizeof] (с. 111)
- 5.3.6 Alignof [expr.alignof] (с. 116)
- 18.2 Типы [support.types] (с. 454–455)
- Стандарт C++03 (ISO/IEC 14882:2003):
- 5.3.3 Sizeof [expr.sizeof] (с. 79)
- Стандарт C++98 (ISO/IEC 14882:1998):
- 5.3.3 Sizeof [expr.sizeof] (с. 77)
См. также
| знаковый целочисленный тип, возвращаемый при вычитании двух указателей (определение типа) |
|
| смещение в байтах от начала типа со стандартной компоновкой до указанного члена (макрос функции) |
|
| целочисленные литералы | двоичные,(начиная с C++14) десятичные, восьмеричные или шестнадцатеричные числа целочисленного типа |
Документация по C для size_t |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/size_t