Тип size_t в С++

642 прочитали

Возможно, вы встречали в исходных кодах на С++ тип size_t, а может и сами его используете. В последнем случае дальше можете не читать )))

Этот тип определён в заголовочных файлах STL как целое число, которое может работать с массивом максимально допустимого на вашем компьютере размера. На 32-разрядных системах это обычно тип long, на 64-разрядных - long long.

Например, в файле _mingw.h часть кода, где объявлен этот тип, выглядит так:

#undef size_t
#ifdef _WIN64
__MINGW_EXTENSION typedef unsigned __int64 size_t;
#else
typedef unsigned int size_t;
#endif /* _WIN64 */
#endif /* _SIZE_T_DEFINED */

То есть в случае с 64-разрядной “Виндой” это будет тип __int64, а на 32-разрядной - тип unsigned int. Если копнуть дальше, то мы увидим, что тип __int64 - это на самом деле long long:

#define __int64 long long

Это объявление можно найти выше в том же файле.

Зачем такие заморочки?

Это связано с вопросами переносимости исходного кода между разными программно-аппаратными платформами. Чтобы у вас не возникало проблем, если вы вдруг решите скомпилировать ваш код на 32-разрядной платформе после 64-разрядной. Например, Visual C++ .NET будет генерировать предупреждение, если вместо size_t вы используете int.

Как использовать size_t, каждый решает сам. Например, если вы работаете с памятью и хотите быть уверены, что вы работаете с типом, который может содержать максимально большое целое число, с помощью которого может быть представлен адрес в памяти, но не знаете при этом наверняка, на какой платформе будет работать ваша программа. В этом случае использование size_t гарантирует, что в вашей программе будет использован тип с максимально возможным значением для данной платформы.

Обычно size_t применяют при переборе таких элементов, как списки, которые создаются динамически, и когда вы заранее не знаете, сколько элементов может содержать список. При выделении памяти вы также не сможете предсказать, какой адрес будет выделен для ваших данных, соответственно, для работы со значением этого адреса вы должны быть уверены, что выбранный тип данных сможет уместить в себе этот адрес.

Ну и для наглядности картинка с примером исходного кода и выводом результата:

Возможно, вы встречали в исходных кодах на С++ тип size_t, а может и сами его используете.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.