﻿# size\_t

_size\_t_ – это специальный беззнаковый целочисленный тип, определенный в стандартных библиотеках языков С и С\+\+\. Является типом результата, возвращаемого оператором [_sizeof_](https://timsong-cpp.github.io/cppwp/n4861/expr.sizeof#5)_ _и_ [alignof](https://timsong-cpp.github.io/cppwp/n4861/expr.alignof#2)_\.

Размер _size\_t_ выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива или объекта\. Другими словами, количество бит в _size\_t_ равно количеству бит, которое требуется для хранения максимального адреса в памяти машины\. Например, на 32\-битной системе _size\_t_ будет занимать 32\-бита, на 64\-битной — 64\-бита\. В свою очередь это означает, что в тип _size\_t_ может быть безопасно помещен указатель \(исключение составляют платформы с сегментной адресацией и указатели на функции\-члены классов\)\.

Данный тип перекладывает заботу о возможном разном поведении целочисленных переменных при смене платформы с плеч программиста на реализацию стандартной библиотеки\. Поэтому использование типа _size\_t_ безопаснее и эффективнее, чем использование обычных беззнаковых целочисленных типов:

1. Данный тип позволяет писать, циклы и счётчики, не беспокоясь о возможном переполнении при смене платформы\. Например, когда количество необходимых итераций превышает _UINT\_MAX_;
1. Поскольку [стандартом](https://timsong-cpp.github.io/cppwp/n4861/support.types.layout#3) гарантируется, что _size\_t_ может вместить в себя размер максимально возможного объекта в системе, этот тип используют для хранения размеров объектов;
1. Из\-за этого же свойства _size\_t_ используют для индексации массивов\. В отличие от обычных базовых целочисленных типов, _size\_t_ гарантирует, что значение индекса не может быть больше _SIZE\_MAX_;
1. Так как в _size\_t_ обычно может быть безопасно помещён указатель, его используют для [адресной арифметики](https://pvs-studio.ru/ru/blog/terms/0005/), однако, для этих целей лучше подходит другой беззнаковый целочисленный тип [_uintptr\_t_](https://pvs-studio.ru/ru/blog/terms/0050/), само название которого отражает его предназначение;
1. Компилятор может построить более простой и, следовательно, более быстрый код, в котором будут отсутствовать лишние преобразования 32\-битных и 64\-битных данных\.

В языке С тип _size\_t_ объявлен в заголовочных файлах _<stddef\.h\>_, _<stdlib\.h\>_, _<string\.h\>_, _<wchar\.h\>_, _<uchar\.h\>_, _<time\.h\>_ и _<stdio\.h\>_\. В языке С\+\+ его декларация находится в файлах _<cstddef\>_, _<cstdlib\>_, _<cstring\>_, _<cwchar\>_, _<cuchar\>_, _<ctime\>_ и _<cstdio\>_\. Тип _size\_t_ размещен в глобальном пространстве имён и в _std_\. Стандартные заголовочные файлы языка C для обеспечения обратной совместимости также могут включаться в С\+\+ программы\.

В терминах статического анализатора [PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/) тип _size\_t_ относится к [memsize](https://pvs-studio.ru/ru/blog/terms/0030/)\-типам\. В анализаторе существует большое количество специальных 64\-битных [диагностических правил](https://pvs-studio.ru/ru/docs/warnings/#64CPP), выдаваемых анализатором и связанных именно с рекомендацией внедрения memsize\-типов\. Если вы планируете заняться разработкой кроссплатформенных проектов или переносом существующих 32\-битных проектов на 64\-битные системы, то вы можете использовать анализатор [PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/), который существенно упростит эту задачу и позволит избежать длительного этапа поиска скрытых ошибок\.

Более подробно об ошибках, которых можно избежать при использовании типа _size\_t_, а также о том, как этот тип данных позволит улучшить и оптимизировать ваши программы, вы можете познакомиться в статьях, приведенных в библиографическом списке\.

## Библиографический список

1. [Что такое size\_t и ptrdiff\_t](https://pvs-studio.ru/ru/blog/posts/cpp/a0050/)\.
1. [Оптимизация 64\-битных программ](https://pvs-studio.ru/ru/blog/posts/cpp/a0030/)\.
1. [7 шагов по переносу программы на 64\-битную систему](https://pvs-studio.ru/ru/blog/posts/cpp/a0042/)\.
1. [64\-битный конь, который умеет считать](https://pvs-studio.ru/ru/blog/posts/cpp/a0043/)\.
1. [Уроки разработки 64\-битных приложений на языке C и С\+\+](https://pvs-studio.ru/ru/blog/lessons/full/)\.