О псевдониме size_t

Часто в коде требуются переменные беззнакового целого типа. При этом, писать «unsigned int» накладно с точки зрения количества символов. На помощь приходит псевдоним size_t, соответствующий беззнаковому целому типу с разрядностью, соответствующей разрядности процессора для целевой платформы.

Наиболее распространёнными на данный момент являются платформы x86 и x64 (фактически, их полные названия x86-32 и x86-64 соответственно). Так, для x86 псевдоним size_t означает беззнаковое целое 32-разрядное число. Как правило, это unsigned int, но всё зависит от реализации стандарта языка в используемом компиляторе (помните, что для таких типов, как int, long, short стандарт C++ не предусматривает чётких требований по их размеру, и всё зависит от конкретной платформы и компилятора). Стандартная библиотека C++ гарантирует, что в качестве типа для size_t будет использован тип с оптимальной разрядностью. Для x64-систем в качестве size_t обычно выступает unsigned long long int.

Основные места, где используется size_t

Определения размеров для массивов

В качестве размера массива некорректно было бы применять знаковое число, так как длина массива не может быть отрицательной. Для динамических массивов ошибка со знаком размера может быть пропущена во время компиляции кода и сказаться только во время выполнения. Выход — использовать size_t:

const size_t N = //…
char array[N];

Циклы с перебором индексов массивов

for(size_t i = 0; i < N; ++i) //…

Счётчики

В переменных, выступающих в качестве счётчиков чего-нибудь, можно использовать size_t при условии, что значение счётчика никогда не может стать отрицательным (например, когда к нему только прибавляются положительные или беззнаковые значения).

size_t counter = 0;
++counter; //…

Почти любые случаи, когда требуется беззнаковое целое число

size_t оптимально применять почти везде, где требуется беззнаковое целое число. Исключения: когда высоки требования к расходованию памяти, а значение переменной не может быть слишком большим (в таком случае можно применять более «короткие» числа); когда требуются числа большей разрядности, чем предоставляет size_t (например, на платформе x86-32).

Особенности использования

Псевдоним size_t объявлен в заголовочном файле <cstddef>.

Использоваться он может без префикса std::

В стандартной библиотеке данный псевдоним очень распространён (так как API std широко его использует в интерфейсах своих классов и функций), поэтому обычно он «подключается» практически любым заголовочным файлом, в частности <iostream>.

Дополнительные преимущества

Основное дополнительное преимущество в том, что когда требуется проверить значение числа, что оно входит в диапазон [0; N), в случае size_t достаточно одной проверки:

if (x < N) //…

В случае знакового числа, эта проверка выглядела бы так:

if ((0 < = x) && (x < N)) //…

Но зачем лишние проверки в случае когда значение по определению не должно принимать отрицательных значений (например для количества символов в строке)? Так сделайте же его беззнаковым! :)

P.S. В следующей статье рассмотрим другие полезные псевдонимы стандартной библиотеки C++

349 views·3 shares