Этот ответ действительно зависит от того, кто будет использовать ваш код и какие стандарты они хотят видеть.
size_t
целочисленный размер с целью:
Тип size_t
является целочисленным беззнаковым целочисленным типом реализации, который достаточно большой, чтобы содержать размер в байтах любого объекта. (Спецификация C ++ 11 18.2.6)
Таким образом, всякий раз, когда вы хотите работать с размером объектов в байтах, вы должны использовать size_t
. Сейчас во многих случаях вы не используете эти измерения / индексы для подсчета байтов, но большинство разработчиков предпочитают использовать size_t
их для согласованности.
Обратите внимание, что вы всегда должны использовать, size_t
если ваш класс должен выглядеть и чувствовать себя как класс STL. Все классы STL в спецификации используют size_t
. Это допустимо для компилятора typedef size_t
быть unsigned int
, и это также допустимо для его определения типа unsigned long
. Если вы используете int
или long
напрямую, вы в конечном итоге столкнетесь с компиляторами, где человек, который думает, что ваш класс следует стилю STL, попадает в ловушку, потому что вы не следовали стандарту.
Что касается использования подписанных типов, есть несколько преимуществ:
- Короткие имена - людям действительно легко печатать
int
, но гораздо сложнее загромождать код unsigned int
.
- Одно целое число для каждого размера. Существует только одно CLS-совместимое целое число из 32 битов, то есть Int32. В C ++ есть два (
int32_t
и uint32_t
). Это может упростить взаимодействие API
Большой недостаток подписанных типов очевиден: вы теряете половину своего домена. Число с подписью не может считаться таким же высоким, как число без знака. Когда появился C / C ++, это было очень важно. Нужно было уметь использовать все возможности процессора, и для этого нужно было использовать беззнаковые числа.
Для целевых приложений .NET не было такой сильной необходимости в полнодоменном индексе без знака. Многие из целей для таких чисел просто недопустимы в управляемом языке (на ум приходит пул памяти). Кроме того, как только вышел .NET, 64-битные компьютеры были явно в будущем. Мы далеки от того, чтобы нуждаться в полном диапазоне 64-битного целого числа, поэтому жертвовать одним битом не так болезненно, как это было раньше. Если вам действительно нужно 4 миллиарда индексов, вы просто переключаетесь на использование 64-битных целых чисел. В худшем случае вы запускаете его на 32-битной машине, и это немного медленно.
Я рассматриваю торговлю как одно из удобных. Если у вас достаточно вычислительной мощности, и вы не возражаете потратить немного своего типа индекса, который вы никогда не будете использовать никогда, тогда удобно просто набирать int
или long
уходить от него. Если вы обнаружите, что действительно хотели этот последний бит, то вам, вероятно, следовало бы обратить внимание на подписанность ваших чисел.
-1
возвращается из функций, которые возвращают индекс, чтобы указать «не найден» или «вне диапазона». Это также возвращается изCompare()
функций (реализацииIComparable
). 32-разрядный тип int считается типом go для общего числа, и я надеюсь, что это очевидные причины.