Короче говоря, size_t
никогда не бывает отрицательным, и это максимизирует производительность, потому что его typedef будет целочисленным типом без знака, который достаточно большой - но не слишком большой - чтобы представить размер максимально возможного объекта на целевая платформа.
Размеры никогда не должны быть отрицательными, и действительно size_t
- это тип без знака. Кроме того, поскольку size_t
без знака, вы можете хранить числа, которые примерно в два раза больше, чем у соответствующего типа со знаком, потому что мы можем использовать бит знака для представления величины, как и все другие биты в целом числе без знака. Когда мы получаем еще один бит, мы умножаем диапазон чисел, которые мы можем представить, примерно в два раза.
Итак, вы спрашиваете, почему бы просто не использовать unsigned int
? Возможно, он не сможет вместить достаточно большие числа. В реализации, где unsigned int
- 32 бита, наибольшее число, которое он может представить, - 4294967295
. Некоторые процессоры, такие как IP16L32, могут копировать объекты размером более 4294967295
байт.
Итак, вы спрашиваете, почему бы не использовать unsigned long int
? Это требует снижения производительности на некоторых платформах. Стандарт C требует, чтобы long
занимал не менее 32 бит. Платформа IP16L32 реализует каждый 32-разрядный код в виде пары 16-разрядных слов. Почти все 32-битные операторы на этих платформах требуют двух инструкций, если не больше, потому что они работают с 32-битными в двух 16-битных блоках. Например, для перемещения 32-битной длины обычно требуется две машинные инструкции - по одной для перемещения каждой 16-битной порции.
Использование size_t
позволяет избежать потери производительности. Согласно этой фантастической статье , "Type size_t
- это typedef, который является псевдонимом для некоторого целого типа без знака, обычно unsigned int
или unsigned long
, но, возможно, даже unsigned long long
. Каждая реализация стандарта C имеет вид должен выбрать целое число без знака, которое достаточно велико - но не больше необходимого - для представления размера максимально возможного объекта на целевой платформе. "