Namespaces
Variants

std:: size_t

From cppreference.net
Utilities library
Определено в заголовочном файле <cstddef>
Определено в заголовочном файле <cstdio>
Определено в заголовочном файле <cstdlib>
Определено в заголовочном файле <cstring>
Определено в заголовочном файле <ctime>
Определено в заголовочном файле <cuchar>
(начиная с C++17)
Определено в заголовочном файле <cwchar>
typedef /* implementation-defined */ size_t ;

std::size_t - это беззнаковый целочисленный тип результата следующих операторов:

(начиная с C++11)

Если программа пытается сформировать тип чрезмерного размера (т.е. количество байтов в её объектном представлении превышает максимальное значение, представимое в std::size_t ), программа является некорректной.

Разрядность std::size_t составляет не менее 16 бит.

(начиная с 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 .

Целочисленный суффикс литерала для std::size_t представляет собой любую комбинацию z или Z с u или U (т.е. zu , zU , Zu , ZU , uz , uZ , Uz , или UZ ).

(начиная с 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
  1. Определение 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