size_t
size_t – это специальный беззнаковый целочисленный тип, определенный в стандартных библиотеках языков С и С++. Является типом результата, возвращаемого оператором sizeof и alignof.
Размер size_t выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива или объекта. Другими словами, количество бит в size_t равно количеству бит, которое требуется для хранения максимального адреса в памяти машины. Например, на 32-битной системе size_t будет занимать 32-бита, на 64-битной — 64-бита. В свою очередь это означает, что в тип size_t может быть безопасно помещен указатель (исключение составляют платформы с сегментной адресацией и указатели на функции-члены классов).
Данный тип перекладывает заботу о возможном разном поведении целочисленных переменных при смене платформы с плеч программиста на реализацию стандартной библиотеки. Поэтому использование типа size_t безопаснее и эффективнее, чем использование обычных беззнаковых целочисленных типов:
- Данный тип позволяет писать, циклы и счётчики, не беспокоясь о возможном переполнении при смене платформы. Например, когда количество необходимых итераций превышает UINT_MAX;
- Поскольку стандартом гарантируется, что size_t может вместить в себя размер максимально возможного объекта в системе, этот тип используют для хранения размеров объектов;
- Из-за этого же свойства size_t используют для индексации массивов. В отличие от обычных базовых целочисленных типов, size_t гарантирует, что значение индекса не может быть больше SIZE_MAX;
- Так как в size_t обычно может быть безопасно помещён указатель, его используют для адресной арифметики, однако, для этих целей лучше подходит другой беззнаковый целочисленный тип uintptr_t, само название которого отражает его предназначение;
- Компилятор может построить более простой и, следовательно, более быстрый код, в котором будут отсутствовать лишние преобразования 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 тип size_t относится к memsize-типам. В анализаторе существует большое количество специальных 64-битных диагностических правил, выдаваемых анализатором и связанных именно с рекомендацией внедрения memsize-типов. Если вы планируете заняться разработкой кроссплатформенных проектов или переносом существующих 32-битных проектов на 64-битные системы, то вы можете использовать анализатор PVS-Studio, который существенно упростит эту задачу и позволит избежать длительного этапа поиска скрытых ошибок.
Более подробно об ошибках, которых можно избежать при использовании типа size_t, а также о том, как этот тип данных позволит улучшить и оптимизировать ваши программы, вы можете познакомиться в статьях, приведенных в библиографическом списке.