web-dev-qa-db-fra.com

Différence entre size_t et std :: size_t

Quelles sont les différences entre size_t et std::size_t en termes de lieu où ils sont déclarés, quand doivent-ils être utilisés et quelles autres caractéristiques de différenciation?

119
Mankarse

C's size_t et C++ std::size_t sont les mêmes.

En C, il est défini dans <stddef.h> et en C++, défini dans <cstddef> dont le contenu est le même que l'en-tête C (voir la citation ci-dessous). Il est défini comme type entier non signé du résultat du sizeof opérateur.

C Standard dit au § 17.7/2,

size_t qui est le type entier non signé du résultat du sizeof opérateur

Et C++ Standard dit (à propos de l'en-tête cstddef) au §18.1/3,

Le contenu est le même que l'en-tête de la bibliothèque C standard, avec les modifications suivantes.

Alors oui, les deux sont identiques; la seule différence est que C++ définit size_t dans std espace de noms.

Veuillez également noter que la ligne ci-dessus indique également "avec les modifications suivantes" qui ne fait pas référence à size_t. Il fait plutôt référence aux nouveaux ajouts (principalement) effectués par C++ dans le langage (non présent en C) qui sont également définis dans le même en-tête.


Wikipedia a de très bonnes informations sur la plage de stockage et la taille de stockage de size_t:

Plage et taille de stockage de size_t

Le type réel de size_t dépend de la plate-forme ; une erreur courante consiste à supposer que size_t est identique à unsigned int, ce qui peut entraîner des erreurs de programmation, [3] [4] lors du passage de 32 à Architecture 64 bits, par exemple.

Selon la norme ISO C 1999 (C99), size_t est un type entier non signé d'au moins 16 bits.

Et le reste, vous pouvez lire cette page sur wikipedia.

77
Nawaz

De C++ 03 "17.4.3.1.4 Types":

Pour chaque type T de la bibliothèque Standard C (note de bas de page 169), les types :: T et std :: T sont réservés à l'implémentation et, lorsqu'ils sont définis, :: T doit être identique à std :: T.

Et note de bas de page 169:

Ces types sont clock_t, div_t, FILE, fpos_t, lconv, ldiv_t, mbstate_t, ptrdiff_t, sig_atomic_t, size_t, time_t, tm, va_list, wctrans_t, wctype_t et wint_t.

16
Michael Burr

std :: size_t est en fait stddef.h's size_t.

cstddef donne ce qui suit:

#include <stddef.h>
namespace std 
{
  using ::ptrdiff_t;
  using ::size_t;
}

... apportant efficacement la définition précédente dans l'espace de noms std.

12
hifier