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
обычно используется для индексации массивов и подсчёта циклов. Программы, которые используют другие типы, такие как
unsigned
int
, для индексации массивов могут завершиться ошибкой, например, на 64-битных системах, когда индекс превышает
UINT_MAX
или если они полагаются на 32-битную модульную арифметику.
При индексации контейнеров C++, таких как
std::string
,
std::vector
и т.д., подходящим типом является вложенный тип
size_type
, предоставляемый такими контейнерами. Обычно он определяется как синоним для
std::size_t
.
Не определено, доступно ли объявление
std::size_t
в каких-либо других заголовках стандартной библиотеки. Реализация может избегать введения этого имени даже тогда, когда стандарт требует использования
std::size_t
.
|
Целочисленный
суффикс литерала
для
|
(начиная с C++23) |
Возможная реализация
using size_t = decltype ( sizeof 0 ) ;
Пример
#include <array> #include <cstddef> #include <iostream> int main() { std::array<std::size_t, 10> a; // Пример с литералом std::size_t из C++23 for (auto i = 0uz; i != a.size(); ++i) std::cout << (a[i] = i) << ' '; std::cout << '\n'; // Пример цикла с декрементом for (std::size_t i = a.size(); i--;) std::cout << a[i] << ' '; std::cout << '\n'; // Обратите внимание, что наивный цикл с декрементом: // for (std::size_t i = a.size() - 1; i >= 0; --i) ... // является бесконечным циклом, потому что беззнаковые числа всегда неотрицательны }
Вывод:
0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| CWG 1122 | C++98 |
std::size_t
was circularly defined
[1]
|
it is implementation-defined |
| CWG 1464 | C++98 |
object size might be not representable in
std::size_t
|
such type is ill-formed |
-
↑
Определение
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 Types [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)
Смотрите также
|
знаковый целочисленный тип, возвращаемый при вычитании двух указателей
(typedef) |
|
|
смещение в байтах от начала
стандартно размещаемого
типа до указанного члена
(функциональный макрос) |
|
| integer literals | двоичные, (since C++14) десятичные, восьмеричные или шестнадцатеричные числа целочисленного типа |
|
C documentation
для
size_t
|
|