Non, size_t
n'est pas nécessairement ce que vous voulez dire par "la parole" taille de la machine qui exécutera le code (dans le cas de la cross-compilation) ou qui a compilé le code (dans le cas normal où le code s'exécute sur le même type de machine qui a compilé le code). C'est un type entier non signé assez grand pour contenir la taille (en octets) de l'objet le plus grand que la mise en œuvre peut allouer.
Un peu d'histoire de l' sizeof
et size_t
Je ne sais pas quand size_t
a été introduit exactement, mais c'était entre 1979 et 1989. La 1ère Édition du K&R Le Langage de Programmation C à partir de 1978 a aucune mention de size_t
. La 7ème Édition Unix Manuel du Programmeur n'a aucune mention de l' size_t
à tous, et qui date de 1979. Le livre "L'Environnement UNIX" par Kernighan et le Brochet de 1984 a aucune mention de size_t
dans l'indice (ni d' malloc()
ou free()
, un peu à ma grande surprise), mais qui n'est qu'indicative, pas concluante. La norme C89 a certainement size_t
.
Le C99 Justification des documents de quelques informations sur sizeof()
et size_t
:
6.5.3.4 L'opérateur sizeof
Il est fondamental à l'utilisation correcte des fonctions telles que l' malloc
et fread
que
sizeof(char)
exactement un. Dans la pratique, cela signifie qu'un octet dans C est le plus petit
unité de stockage, même si cette unité est de 36 bits de large; et tous les objets sont composés d'un nombre entier
nombre de ces plus petites unités. S'applique également si la mémoire est bits adressables.
C89, comme le K&R, définie le résultat de l' sizeof
opérateur d'être une constante de type entier non signé. Commune de mise en œuvre, l'usage commun, ont souvent supposé que le
type obtenu est - int
. Ancien code qui dépend de ce comportement n'a jamais été portables à
implémentations qui définissent la raison d'être d'un type autre que int
. Le C89 Comité n'a pas
l'impression que c'était bon pour changer la langue pour protéger un code incorrect.
Le type d' sizeof
, quel qu'il soit, est publié (dans la bibliothèque de l'en-tête <stddef.h>
) que
size_t
, car il est utile pour le programmeur de pouvoir se référer à ce type. Cette exigence
implicitement restreint size_t
être un synonyme pour un type entier non signé. Notez également
que, bien qu' size_t
est un type non signé, sizeof
ne font appel à aucun des opérations arithmétiques
ou de conversions qui en résulterait dans le module de problème si la taille est trop grande pour le représenter comme une
size_t
, ce qui annule toute notion que la plus grande pouvant être déclarés objet peut être trop gros pour étendre, même avec un unsigned long
en C89 ou uintmax_t
en C99. Cela limite également la
nombre maximal d'éléments qui peuvent être déclarées dans un tableau, puisque, pour toute matrice a
de N
éléments,
N == sizeof(a)/sizeof(a[0])
Ainsi, size_t
est également une pratique de type pour le tableau des tailles, et est donc utilisé dans plusieurs fonctions de la bibliothèque. [...]
7.17 définitions Communes
<stddef.h>
est un en-tête inventé pour fournir des définitions de plusieurs types et macros largement utilisé en conjonction avec la bibliothèque: ptrdiff_t
, size_t
, wchar_t
, et NULL
.
Y compris toute tête qui fait référence à l'une de ces macros aussi la définir, une exception à la
d'habitude bibliothèque de règle que chaque macro ou une fonction appartient à exactement un en-tête.
Notez que cette mentionne spécifiquement que l' <stddef.h>
a été inventé par le C89 comité. Je n'ai pas trouvé les mots qui disent qu' size_t
a également été inventé par le C89 comité, mais si elle n'était pas, c'était une codification d'un assez récents de développement en C.
Dans un commentaire à bmargulies réponse, vonbrand dit qu '"il [size_t
] est certainement ANSI-C-isme". Je peux très facilement croire que c'était une innovation à l'origine de l'ANSI (ISO) C, même si elle est légèrement bizarre que la justification n'est pas l'état qui.