Je suis tellement confus size_t
. J'ai recherché sur Internet et partout mentionné qu'il size_t
s'agit d'un type non signé, il ne peut donc représenter que des valeurs non négatives.
Ma première question est: s'il est utilisé pour ne représenter que des valeurs non négatives, pourquoi n'utilisons-nous pas unsigned int
place de size_t
?
Ma deuxième question est: sont size_t
et unsigned int
interchangeables ou non? Sinon, pourquoi?
Et quelqu'un peut-il me donner un bon exemple size_t
et brièvement de son fonctionnement?
typedef /*This part is implementation dependent */ size_t;
Réponses:
Car
unsigned int
n'est pas le seul type entier non signé.size_t
pourrait être l' ununsigned char
,unsigned short
,unsigned int
,unsigned long
ouunsigned long long
, en fonction de la mise en œuvre.Ils ne sont pas interchangeables, pour la raison expliquée ci-dessus
^^
.Je ne comprends pas tout à fait ce que vous entendez par «son bref fonctionnement». Il fonctionne comme tout autre type non signé (en particulier, comme le type sur lequel il est tapé). Vous êtes encouragé à utiliser
size_t
lorsque vous décrivez la taille d'un objet. En particulier, l'sizeof
opérateur et diverses fonctions de bibliothèque standard, telles questrlen()
, returnsize_t
.Bonus: voici un bon article sur
size_t
(et leptrdiff_t
type étroitement lié ). Cela explique très bien pourquoi vous devriez l'utiliser.la source
size_t
être ununsigned char
? Est-ce dans la norme que c'est autorisé? Je veux dire avec cette idée comment pourrait-on s'attendre à ce que quelqu'un utilisecalloc()
(et sa famille),strlen()
etc.? Cela me paraît absurde.size_t
est défini dans la norme comme étant un "type entier non signé", mais n'exige pas qu'il soit le même que l'un desunsigned {char, short, int, long, long long}
.Il existe 5 types d'entiers non signés standard en C:
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
avec diverses exigences pour leurs tailles et plages (brièvement, la plage de chaque type est un sous-ensemble de la plage du type suivant, mais certains d'entre eux peuvent avoir la même plage).
size_t
est untypedef
(c'est-à-dire un alias) pour un type non signé, (probablement l'un des types ci-dessus mais peut-être un type entier non signé étendu , bien que ce soit peu probable). C'est le type cédé par lesizeof
opérateur.Sur un système, il peut être judicieux d'utiliser
unsigned int
pour représenter les tailles; sur un autre, il pourrait être plus judicieux d'utiliserunsigned long
ouunsigned long long
. (ilsize_t
est peu probable que ce soit l'ununsigned char
ou l' autreunsigned short
, mais c'est permis).Le but de
size_t
est de dispenser le programmeur d'avoir à se soucier de savoir lequel des types prédéfinis est utilisé pour représenter les tailles.Le code qui suppose
sizeof
un rendementunsigned int
ne serait pas portable. Code qui suppose qu'il donne unsize_t
est plus susceptible d'être portable.la source
unsigned int
- direunsigned long
, etc.) quisize_t
correspond à dépend de la machine sur laquelle le code est exécuté? c'est-à-dire sur une architecture de machine, cela correspond àunsigned int
mais sur une autre architecture à laquelle il correspondraunsigned long
, etc?size_t
, en particulier si, par exemple,unsigned long
etunsigned long long
sont de la même taille.long
,long long
etc. dépend du système: si vous regardez,limits.h
vous verrez au moins sous Unices que la valeur maximum pour les entiers dépend de la taille des mots du système.size_t
a une restriction spécifique.Citant de http://www.cplusplus.com/reference/cstring/size_t/ :
Il n'est pas interchangeable avec
unsigned int
car la taille deint
est spécifiée par le modèle de données. Par exemple, LLP64 utilise un 32 bitsint
et ILP64 un 64 bitsint
.la source
size_t est utilisé pour stocker les tailles des objets de données, et il est garanti qu'il peut contenir la taille de tout objet de données que l'implémentation C particulière peut créer. Ce type de données peut être plus petit (en nombre de bits), plus grand ou exactement le même que unsigned int.
la source
Outre les autres réponses, il documente également le code et indique aux gens que vous parlez de la taille des objets en mémoire
la source
apple
est une pomme , asize_t
est une taille ...Le type size_t est un type entier non signé de base du langage C / C ++. C'est le type du résultat renvoyé par l'opérateur sizeof. La taille du type est choisie de manière à pouvoir stocker la taille maximale d'un tableau théoriquement possible de tout type. Sur un système 32 bits, size_t prendra 32 bits, sur un 64 bits 64 bits. En d'autres termes, une variable de type size_t peut stocker un pointeur en toute sécurité. L'exception concerne les pointeurs vers des fonctions de classe, mais il s'agit d'un cas particulier. Bien que size_t puisse stocker un pointeur, il est préférable d'utiliser un autre type entier non signé uintptr_t à cette fin (son nom reflète sa capacité). Les types size_t et uintptr_t sont des synonymes. Le type size_t est généralement utilisé pour les compteurs de boucles, l'indexation de tableaux et l'arithmétique d'adresses. La valeur maximale possible du type size_t est la constante SIZE_MAX.
la source
size_t
peut stocker la taille de n'importe quel objet unique. Un pointeur peut pointer vers n'importe quel octet de n'importe quel objet. Vous pouvez avoir un système avec, par exemple, un espace d'adressage de 64 bits qui limite la taille d'un objet à 2 ** 32-1 octets. Il n'y a aucune garantie quesize_t
etuintptr_t
sont du même type.En termes simples, size_t dépend de la plate-forme et dépend de la mise en œuvre, tandis que unsigned int dépend uniquement de la plate-forme.
la source