Этот ответ действительно зависит от того, кто будет использовать ваш код и какие стандарты они хотят видеть.
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 для общего числа, и я надеюсь, что это очевидные причины.