Ця відповідь справді залежить від того, хто збирається використовувати ваш код та які стандарти вони хочуть бачити.
size_t
- цілий розмір з метою:
Тип size_t
- це визначений реалізацією цілочисельний тип без підпису, який достатньо великий, щоб містити розмір у байтах будь-якого об'єкта. (Специфікація C ++ 11 18.2.6)
Таким чином, будь-коли, коли ви хочете працювати з розміром об'єктів у байтах, ви повинні використовувати size_t
. Зараз у багатьох випадках ви не використовуєте ці параметри / індекси для підрахунку байтів, але більшість розробників вирішують використовувати size_t
їх для послідовності.
Зауважте, що ви завжди повинні використовувати, size_t
якщо ваш клас призначений мати вигляд класу STL. Усі STL-класи в специфікації використовують size_t
. Це справедливо для компілятора ЬурейеЕ size_t
бути unsigned int
, і це справедливо і для того , щоб бути typedefed до 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-бітний інт вважається переходом до типу для загального числа, тому, що я сподіваюся, є очевидними причинами.