28 votes

La taille est-elle la taille du mot?

size_t la taille de mot de la machine qui a compilé le code?

En analysant avec g ++, mon compilateur voit size_t comme un long unsigned int . Le compilateur choisit-il en interne la taille de size_t , ou size_t réellement défini dans une macro de pré-processeur dans stddef.h à la taille du mot avant que le compilateur ne soit appelé ?

Ou suis-je loin de la piste?

20voto

Pete Becker Points 27371

Dans la norme C ++, [support.types] (18.2) / 6: "Le type size_t est un type entier non signé défini par l'implémentation qui est suffisamment grand pour contenir la taille en octets de n'importe quel objet."

Cela peut ou non être la même chose qu'une "taille de mot", quoi que cela signifie.

12voto

Jonathan Leffler Points 299946

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

3voto

templatetypedef Points 129554

Pas nécessairement. Le C ISO spec (§17.1/2) définit size_t comme

size_t, qui est du type entier non signé de la suite de l' sizeof de l'opérateur

En d'autres termes, size_t doit être suffisamment grand pour contenir la taille de toute expression qui pourrait être produite à partir de sizeof. Cela pourrait être la machine de la taille de mot, mais il pourrait être considérablement plus petite (si, par exemple, le compilateur a limité la taille maximale des tableaux ou des objets) ou considérablement plus grand (si le compilateur ont été pour vous permettre de créer des objets tellement énorme que d'une seule machine word ne peut pas stocker la taille de l'objet).

Espérons que cette aide!

2voto

bmargulies Points 49855

size_t est, originairement, juste un typedef dans sys/types.h (traditionnellement sur Unix/Linux). Il était supposé être "assez grand" pour, disons, la taille maximale d'un fichier, ou de l'allocation maximale avec malloc. Cependant, au fil du temps, les comités des normes a saisi, et donc à la liquidation de la copiés dans beaucoup de différents fichiers d'en-tête, protégé à chaque fois avec son propre #ifdef protection de définition de plusieurs. D'autre part, l'émergence de systèmes 64 bits avec un très grand potentiel de tailles de fichier assombri son rôle. Donc c'est un peu un palimpset.

Les normes linguistiques en maintenant l'appeler comme vivant dans stddef.h. Il n'a pas de relation nécessaire pour le matériel mot de taille, et pas de compilateur de la magie. Voir d'autres réponses par rapport à ce que ces normes de dire à propos de comment elle est grande.

0voto

Gilbert Points 1345

Ces définitions sont toutes définies par l'implémentation. J'utiliserais la taille de (char *), ou peut-être sizeof (void *), si j'avais besoin d'une meilleure taille de supposition. Le mieux que cela donne est la taille apparente des logiciels utilisés par le logiciel ... ce que le matériel a vraiment peut être différent (par exemple, un système 32 bits peut prendre en charge des entiers 64 bits par logiciel).

De plus, si vous êtes nouveau dans les langages C, consultez stdint.h pour toutes sortes de documents sur les tailles entières.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X