Spec-Zone.ru › C++

std::size_t

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

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

  • sizeof
  • sizeof...
  • alignof
(начиная с C++11)

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

Разрядность std::size_t не меньше 16.

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

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

(начиная с 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 такой тип некорректен
  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 Типы [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)

См. также

ptrdiff_t
знаковый целочисленный тип, возвращаемый при вычитании двух указателей
(определение типа)
offsetof
смещение в байтах от начала типа со стандартной компоновкой до указанного члена
(макрос функции)
целочисленные литералы двоичные,(начиная с 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API