Je vois des variables définies avec ce type mais je ne sais pas d’où il vient ni quel est son but. Pourquoi ne pas utiliser int ou unsigned int? (Qu'en est-il des autres types "similaires"? Void_t, etc.).
De Wikipedia
Le
stdlib.h
etstddef.h
Les fichiers d’en-tête définissent un type de données appelésize_t
1 qui est utilisé pour représenter la taille d'un objet. Les fonctions de bibliothèque prenant des tailles s’attendent à ce qu’elles soient de typesize_t
, et l'opérateur sizeof est évalué àsize_t
.Le type actuel de
size_t
dépend de la plate-forme; une erreur commune est de supposer quesize_t
est identique à unsigned int, ce qui peut entraîner des erreurs de programmation, 2 d'autant plus que les architectures 64 bits deviennent plus courantes.
De C99 7.17.1/2
Les types et macros suivants sont définis dans l’en-tête standard
stddef.h
<snip>
size_t
qui est le type entier non signé du résultat de l'opérateur sizeof
size_t
est le type d’entier non signé du résultat de l’opérateur sizeof (ISO C99, section 7.17.)
L'opérateur sizeof
donne la taille (en octets) de son opérande, qui peut être une expression ou le nom entre parenthèses d'un type. La taille est déterminée à partir du type de l'opérande. Le résultat est un entier. La valeur du résultat est définie par l'implémentation et son type (un type entier non signé) est size_t
_ (ISO C99, section 6.5.3.4.)
Selon description de la taille sur en.cppreference.comsize_t
est défini dans les en-têtes suivants:
std::size_t
...
Defined in header <cstddef>
Defined in header <cstdio>
Defined in header <cstring>
Defined in header <ctime>
Defined in header <cwchar>
Concrètement, size_t
Représente le nombre d'octets que vous pouvez adresser. Sur la plupart des architectures modernes des 10-15 dernières années, 32 bits ont également été utilisés, ce qui correspond à la taille d’un entier non signé. Cependant, nous passons à l'adressage 64 bits alors que le uint
restera probablement à 32 bits (sa taille n'est pas garantie dans la norme c ++). Pour rendre votre code qui dépend de la taille de la mémoire portable entre les architectures, vous devez utiliser un size_t
. Par exemple, des choses telles que la taille des tableaux doivent toujours utiliser les propriétés de size_t
. Si vous examinez les conteneurs standard, la ::size()
renvoie toujours un size_t
.
Notez également que visual studio dispose d'une option de compilation permettant de détecter ces types d'erreur, intitulée "Détecter les problèmes de portabilité 64 bits".
De cette façon, vous savez toujours quelle est la taille, car un type spécifique est dédié aux tailles. La question même montre que cela peut être un problème: est-ce un int
ou un unsigned int
? Aussi, quelle est la magnitude (short
, int
, long
, etc.)?
Comme un type spécifique est attribué, vous n'avez pas à vous soucier de la longueur ou de la signature.
La définition réelle peut être trouvée dans le bibliothèque de référence C++ , qui dit:
Type:
size_t
(Type intégral non signé)Entête:
<cstring>
size_t
correspond au type de données intégral renvoyé par l’opérateur de langagesizeof
et est défini dans le<cstring>
fichier d’en-tête (entre autres) en tant que type intégral non signé.Dans
<cstring>
, il est utilisé comme type du paramètrenum
dans les fonctionsmemchr
,memcmp
,memcpy
,memmove
,memset
,strncat
,strncmp
,strncpy
etstrxfrm
, qui, dans tous les cas, sont utilisés pour spécifier le nombre maximal d'octets ou de caractères la fonction doit affecter.Il est également utilisé comme type de retour pour
strcspn
,strlen
,strspn
etstrxfrm
pour renvoyer des tailles et des longueurs.
size_t doit être défini dans les en-têtes de votre bibliothèque standard. Selon mon expérience, il s’agit généralement d’un simple typedef à unsigned int. Cependant, le fait est que ce n'est pas nécessaire. Des types tels que size_t permettent au fournisseur de bibliothèque standard de modifier les types de données sous-jacents, le cas échéant, pour la plate-forme. Si vous supposez que size_t est toujours non signé (par transtypage, etc.), vous risquez de rencontrer des problèmes ultérieurement si votre fournisseur modifie size_t, par exemple. un type 64 bits. Il est dangereux de supposer quoi que ce soit à propos de ce type de bibliothèque ou de tout autre pour cette raison.
Dans les programmes minimalistes où un size_t
La définition n’a pas été chargée "par hasard" dans certains include, mais j’en ai toujours besoin dans certains contextes (par exemple, pour accéder à std::vector<double>
), alors j'utilise that context pour extraire le type correct. Par exemple typedef std::vector<double>::size_type size_t
.
(Surround avec namespace {...}
si nécessaire pour limiter la portée.)
Je ne connais pas void_t
sauf suite à une recherche sur Google (il est utilisé dans ne bibliothèque vmalloc
de Kiem-Phong Vo chez AT & T Research - je suis sûr que cela est également utilisé dans d'autres bibliothèques) .
Les diverses typedefs xxx_t sont utilisées pour extraire un type d'une implémentation définie particulière, car les types concrets utilisés pour certaines choses peuvent différer d'une plate-forme à une autre. Par exemple:
Void_t
résume le type de pointeur renvoyé par les routines de bibliothèque vmalloc
car il a été écrit pour fonctionner sur des systèmes antérieurs à ANSI/ISO C où le mot clé void
n'existait peut-être pas. Au moins c'est ce que je devine.wchar_t
résume le type utilisé pour les caractères larges, car sur certains systèmes, ce sera un type 16 bits, sur d’autres, un type 32 bits.Donc, si vous écrivez votre code de traitement de caractères larges pour utiliser le wchar_t
tapez à la place de, disons unsigned short
, ce code sera probablement plus portable sur diverses plates-formes.
Quant à "Pourquoi ne pas utiliser int ou unsigned int?", Tout simplement parce que c'est sémantiquement plus significatif. Il y a la raison pratique pour laquelle il peut être, par exemple, typedef
d sous la forme d'un int
, puis mis à niveau vers un long
plus tard, sans que personne n'ait à changer de code, bien sûr, mais plus fondamentalement que cela, un type est supposé avoir un sens. Pour simplifier considérablement, une variable de type size_t
est approprié pour et contient des tailles d'objets similaires, tout comme time_t
convient pour contenir des valeurs de temps. La manière dont celles-ci sont réellement mises en œuvre devrait être le travail de la mise en œuvre. Comparé à tout appeler int
, utiliser des noms de caractères significatifs comme celui-ci permet de clarifier le sens et l’intention de votre programme, comme le ferait tout ensemble riche de types.