evgeniy8705
@evgeniy8705
Повелитель вселенной

Чем отличаются size_type, size_t, unsigned X?

Подскажите в чем отличие size_type, size_t и к примеру unsigned int и где когда что использовать?
Единственное что я понял что size_type выражает размер контейнера, size_t возвращается после вызова sizeof, но никак не могу понять их различия и кейсы употребления.

Вроде как при итерации контейнеров как я понял, стоит использовать size_type для индекса, так как он должен гарантировано вместить любой размер контейнера, а обычный int не факт что позволит это при очень большом контейнере, но, к примеру беззнаковый int в системе 32 битный и тогда вполне реально индексировать до 4ккк+ элементов и тут логичный вопрос: используются ли в практике контейнеры такого размера?

И как устроен size_type тогда? Допустим у меня строка на 100 символов, мне нужно перебрать каждый символ. В цикле указываю тип индекса size_type. Сколько памяти выделится под индекс? Не совсем понимаю как в итоге определяется сколько бит выделится под индекс.

А также вообще не понимаю когда в каких случаях использовать size_t
  • Вопрос задан
  • 1207 просмотров
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
size_type - это обычно typedef из других типов, который разработчик контейнера решил использовать в контейнере. Скорее всего это будет тот же size_t. Для данного конкретного контейнера логично использовать его size_type.
Размер size_t привязан к размеру указателя, т.е. sizeof(void*) == sizeof(size_t).
Как раз это и обеспечивает, то что size_t может индексировать всю возможную память (по байту) для конкретной архитектуры процессора. Размер size_t на х32 - 4 байта, на х64 - 8 байт. Размер указателя, в свою очередь, равен размеру адресной шины процессора.
В общем случае для счетчиков элементов и т.п. вещей всегда используйте size_t. Но если вы точно знаете, что у вас вот в этом конкретном контейнере/массиве не может быть больше n-ого количества элементов (например массив фиксированного размера), то можно использовать тип меньшей разрядности, достаточный для индексации контейнера.
Переменные счетчиков, индексов и т.п. обычно делаются беззнаковыми (size_t - беззнаковый), потому что обычно алгоритмически эти переменные никогда не принимают отрицательных значений. Так зачем терять лишний значащий разряд? Но это не всегда так, в каждом конкретном случае нужно делать свой выбор, универсальных решений нет.
Бывает ли на практике размер контейнера таких размеров которые вмещаются в size_t? В базах данных запросто может быть таблица размером больше, чем помещается в 4 байтовый size_t. Максимальное значение 8 байтового size_t - это ооочень большое число. В практических задачах вряд ли найдется контейнер, вмещающий такое количество объектов (но всегда могут быть исключения). Но итерироваться или считать можно не только объекты в контейнере, можно считать например байты/сектора на диске или пакеты в интернете или контейнер может лежать в распределенной системе хранения размером в экзабайты или больше (сейчас это уже реально).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы