Cette réponse dépend vraiment de qui va utiliser votre code et des normes qu'ils souhaitent voir.
size_t
est une taille entière avec un objectif:
Le type size_t
est un type entier non signé défini par l'implémentation qui est suffisamment grand pour contenir la taille en octets de n'importe quel objet. (Spécification C ++ 11 18.2.6)
Ainsi, chaque fois que vous souhaitez travailler avec la taille des objets en octets, vous doit utiliser size_t
. Maintenant, dans de nombreux cas, vous n'utilisez pas ces dimensions / index pour compter les octets, mais la plupart des développeurs choisissent de les utiliser à des fins size_t
de cohérence.
Notez que vous devez toujours utiliser size_t
si votre classe est conçue pour avoir l'apparence d'une classe STL. Toutes les classes STL de la spécification utilisent size_t
. Il est valide pour que le compilateur typedef size_t
soit unsigned int
, et il est également valide pour qu'il soit typé à unsigned long
. Si vous utilisez int
ou long
directement, vous finirez par rencontrer des compilateurs où une personne qui pense que votre classe a suivi le style de la STL est piégée parce que vous n'avez pas suivi la norme.
Quant à l'utilisation de types signés, il y a quelques avantages:
- Noms plus courts - il est vraiment facile pour les gens de taper
int
, mais beaucoup plus difficile à encombrer le code unsigned int
.
- Un entier pour chaque taille - Il n'y a qu'un seul entier conforme CLS de 32 bits, qui est Int32. En C ++, il y a deux (
int32_t
et uint32_t
). Cela peut simplifier l'interopérabilité des API
Le gros inconvénient des types signés est évident: vous perdez la moitié de votre domaine. Un numéro signé ne peut pas compter autant qu'un numéro non signé. Lorsque C / C ++ est apparu, c'était très important. L'un devait être en mesure de gérer toutes les capacités du processeur, et pour ce faire, vous deviez utiliser des numéros non signés.
Pour les types d'applications .NET ciblés, le besoin d'un index non signé de domaine complet n'était pas aussi fort. De nombreux objectifs pour de tels nombres ne sont tout simplement pas valides dans un langage géré (le regroupement de mémoire vient à l'esprit). De plus, avec la sortie de .NET, les ordinateurs 64 bits étaient clairement l'avenir. Nous sommes loin d'avoir besoin de la gamme complète d'un entier 64 bits, donc sacrifier un bit n'est pas aussi douloureux qu'auparavant. Si vous avez vraiment besoin de 4 milliards d'index, vous passez simplement à l'utilisation d'entiers 64 bits. Au pire, vous l'exécutez sur une machine 32 bits et c'est un peu lent.
Je considère le métier comme un métier de commodité. S'il vous arrive d'avoir une puissance de calcul suffisante pour que cela ne vous dérange pas de gaspiller un peu de votre type d'index que vous n'utiliserez jamais, alors il est pratique de simplement taper int
ou long
et de s'en éloigner. Si vous trouvez que vous vouliez vraiment ce dernier morceau, alors vous auriez probablement dû faire attention à la signature de vos numéros.
-1
est renvoyé par les fonctions qui renvoient un index, pour indiquer «introuvable» ou «hors de portée». Il est également revenu desCompare()
fonctions (implémentationIComparable
). Un entier 32 bits est considéré comme le type de frappe pour un nombre général, pour ce que j'espère être des raisons évidentes.