web-dev-qa-db-fra.com

size_t vs int en C++ et/ou C

Pourquoi, dans les conteneurs C++, renvoie-t-il size_type plutôt que int? Si nous créons nos propres structures, devrions-nous aussi être encouragés à utiliser size_type?

29
John Jiang

En général, size_t devrait être utilisé chaque fois que vous mesurez la taille de quelque chose. Il est vraiment étrange que size_t ne soit requis que pour représenter entre 0 et SIZE_MAX octets et que SIZE_MAX ne soit requis que de 65 535 ...

Les autres contraintes intéressantes des standards C++ et C sont:

  • le type de retour de sizeof() est size_t et il s’agit d’un entier non signé
  • operator new() prend le nombre d'octets à allouer en tant que paramètre size_t
  • size_t est défini dans <cstddef>
  • SIZE_MAX est défini dans <limits.h> dans C99 mais n'est pas mentionné dans C++ 98?!
  • size_t n'est pas inclus dans la liste des types entiers fondamentaux donc j'ai toujours supposé que size_t est un alias de type pour l'un des types fondamentaux: char, short int, int et long int.

Si vous comptez des octets, vous devriez certainement utiliser size_t. Si vous comptez le nombre d'éléments, vous devriez probablement utiliser size_t, car cela semble être ce que C++ a utilisé. Dans tous les cas, vous ne voulez pas utiliser int - utilisez au minimum unsigned long ou unsigned long long si vous utilisez TR1. Ou ... encore mieux ... typedef quoi que vous finissiez par utiliser pour size_type ou tout simplement inclure <cstddef> et utiliser std::size_t.

26
D.Shawley

Quelques raisons pourraient être:

  • Le type (size_t) peut être défini comme le plus grand entier non signé sur cette plate-forme. Par exemple, il peut être défini comme un entier 32 bits ou un entier 64 bits ou autre chose capable de stocker des valeurs non signées d'une grande longueur.
  • Pour préciser lors de la lecture d’un programme que la valeur est une taille et pas seulement un int

Si vous écrivez une application juste pour vous et/ou jetable, vous pouvez probablement utiliser un int de base. Si vous écrivez une bibliothèque ou quelque chose de substantiel, size_t est probablement une meilleure solution.

9
Dave

Certaines des réponses sont plus compliquées que nécessaire. Size_t est un type entier non signé dont la taille est garantie pour stocker la taille en octets de tout objet en mémoire. En pratique, il a toujours la même taille que le type de pointeur. Sur les systèmes 32 bits, il s'agit de 32 bits. Sur les systèmes 64 bits, il s'agit de 64 bits. 

5
Andy Ross

Tous les conteneurs dans la stl ont différents types de fichiers. Par exemple, value_type est le type d'élément et size_type est le type de numéro stocké. De cette manière, les conteneurs sont complètement génériques en fonction de la plate-forme et de la mise en œuvre.

Si vous créez vos propres conteneurs, vous devez également utiliser size_type. Ceci est généralement fait

typedef std::size_t size_type;

Si vous voulez la taille d'un conteneur, vous devez écrire

typedef vector<int> ints;
ints v;
v.Push_back(4);
ints::size_type s = v.size();

Ce qui est bien, c’est que si vous voulez utiliser une liste plus tard, remplacez simplement typedef par

typedef list<int> ints;

Et ça va encore marcher!

2
rlbond

C++ est un langage qui pourrait être implémenté sur différentes architectures et plates-formes matérielles. Au fil du temps, il a pris en charge les architectures 16, 32 et 64 bits, et probablement d’autres à l’avenir. size_type et d'autres alias de types permettent aux bibliothèques d'isoler les programmeurs/codes des détails d'implémentation.

En supposant que le size_type utilise 32 bits sur les ordinateurs 32 bits et 64 bits sur les ordinateurs 64 bits, le même code source fonctionnerait probablement mieux si vous avez utilisé size_type si nécessaire. Dans la plupart des cas, vous pouvez supposer que ce serait la même chose que unsigned int, mais ce n'est pas garanti.

size_type est utilisé pour exprimer les capacités des conteneurs STL comme std::vector alors que size_t est utilisé pour exprimer la taille en octets d'un objet en C/C++.

1
Eugene Yokota

Je suppose que vous voulez dire "size_t" - c'est une façon d'indiquer un entier non signé (un entier qui ne peut être que positif, jamais négatif) - cela a du sens pour la taille des conteneurs car vous ne pouvez pas avoir un tableau de taille de -7. Je ne dirais pas que vous devez utiliser size_t mais cela indique aux autres personnes utilisant votre code "Ce nombre est toujours positif." Cela vous donne également une plus grande gamme de nombres positifs, mais cela n’aura probablement aucune importance si vous n’avez pas de très gros conteneurs.

1
MatrixFrog

size_t n'est pas signé, donc même s'ils sont tous deux en 32 bits, cela ne signifie pas tout à fait la même chose qu'un int non qualifié. Je ne sais pas pourquoi ils ont ajouté le type, mais sur de nombreuses plates-formes aujourd'hui, sizeof (size_t) == sizeof (int) == sizeof (long), le type que vous choisissez dépend de vous. Notez que ces relations ne sont pas garanties par la norme et deviennent rapidement obsolètes avec l’installation de plates-formes 64 bits.

Pour votre propre code, si vous avez besoin de représenter quelque chose qui est une "taille" conceptuellement et qui ne peut jamais être négatif, size_t serait un choix judicieux.

0
Dan Olson

il n'est pas garanti que les ints aient 4 octets dans la spécification, ils ne sont donc pas fiables. Oui, size_type serait préféré à ints

0
Charles Ma