Когда / где / почему size_t не является uint?

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

Существуют ли какие-либо реализации компилятора, в которых size_t на самом деле не является uint? Каковы основания для такой критики?


person Community    schedule 11.06.2013    source источник


Ответы (1)


size_t - это «размер, соответствующий наибольшему возможному диапазону адресов, который вы можете использовать в аппарате» (или несколько слов, примерно описывающих этот эффект).

В частности, size_t будет 64-битным на 64-битной машине и 32-битным в 32-битной системе.

Я предполагаю, что uint не хватает unsigned int, который почти всегда 32-битный (в наши дни некоторые старые системы будут использовать 16-битные целые числа). Таким образом, в 64-битной системе unsigned int по-прежнему будет 32-битным, хотя размер выделенной памяти, строк и т. Д. Может превышать 32 бита, что может вызвать проблемы, если вы попытаетесь использовать uint в качестве размера.

person Mats Petersson    schedule 11.06.2013
comment
IIRC также необходимо быть без подписи - person Balog Pal; 11.06.2013
comment
Тип для size_t не обязательно беззнаковый, но гарантированно будет достаточно большим для любого выделения памяти в системе. Так что он никогда не переполнится (если вы не используете его плохо). - person Mats Petersson; 11.06.2013
comment
@MatsPetersson - сейчас у меня нет 64-битного компилятора, но я предполагаю, что int - это ширина регистра ЦП, и логически и логически то же самое для uint. Разве это не так? - person ; 11.06.2013
comment
@ user2341104: в то время как исходное намерение int действительно было соответствовать естественному размеру регистра, приближаясь к 64-битному, многие ABI решили, что это будет ужасная трата, и сделали его 32-битным даже для 64-битных зарегистрированных платформ - person Balog Pal; 11.06.2013
comment
Нет, int определенно не является 64-битным в типичной 64-битной системе (все Windows, Linux, MacOS используют 32-битную int, а кроме Windows, long является 64-битной - Windows по традиции имеет загрузку кода, использующего long в местах, которые имеют больше смысла быть 32-битными, поэтому они решили, что long long требуется для 64-битных значений). - person Mats Petersson; 11.06.2013