web-dev-qa-db-fra.com

Où puis-je trouver la définition de size_t?

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.).

112
Eliseo Ocampos

De Wikipedia

Le stdlib.h et stddef.h Les fichiers d’en-tête définissent un type de données appelé size_t1 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 type size_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 que size_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

111
Martin Liversage

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.)

25
fpmurphy

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>
24
stefanB

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".

4
Matt Price

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 langage sizeof 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ètre num dans les fonctions memchr, memcmp, memcpy, memmove, memset, strncat, strncmp, strncpy et strxfrm, 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 et strxfrm pour renvoyer des tailles et des longueurs.

2
lavinio

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.

2
Ryan

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.)

1
alfC

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:

  • size_t résume le type utilisé pour contenir la taille des objets car, sur certains systèmes, il s'agira d'une valeur 32 bits, sur d'autres, elle peut être 16 bits ou 64 bits.
  • 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.

1
Michael Burr

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, typedefd 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.

1
Paul Griffiths