Sur un système 64 bits, sizeof(unsigned long)
dépend du modèle de données implémenté par le système, par exemple, il est de 4 octets sur LLP64 (Windows), 8 octets sur LP64 (Linux, etc.). Qu'est-ce que sizeof(size_t)
est censé être? Cela varie-t-il avec le modèle de données comme le fait sizeof(long)
? Si c'est le cas, comment?
Les références:
size_t est défini par la norme C comme étant le type de retour entier non signé de l'opérateur sizeof (C99 6.3.5.4.4), et l'argument de malloc et ses amis (C99 7.20.3.3 etc.). La plage réelle est définie de telle sorte que le maximum (SIZE_MAX) soit d'au moins 65535 (C99 7.18.3.2).
Cependant, cela ne nous permet pas de déterminer sizeof (size_t). L'implémentation est libre d'utiliser n'importe quelle représentation qu'elle aime pour size_t - il n'y a donc pas de limite supérieure sur la taille - et l'implémentation est également libre de définir un octet sur 16 bits, auquel cas size_t peut être équivalent à char non signé.
En mettant cela de côté, cependant, en général, vous aurez 32 bits size_t sur les programmes 32 bits et 64 bits sur les programmes 64 bits, quel que soit le modèle de données. Généralement, le modèle de données n'affecte que les données statiques; par exemple, dans GCC:
`-mcmodel=small'
Generate code for the small code model: the program and its
symbols must be linked in the lower 2 GB of the address space.
Pointers are 64 bits. Programs can be statically or dynamically
linked. This is the default code model.
`-mcmodel=kernel'
Generate code for the kernel code model. The kernel runs in the
negative 2 GB of the address space. This model has to be used for
Linux kernel code.
`-mcmodel=medium'
Generate code for the medium model: The program is linked in the
lower 2 GB of the address space but symbols can be located
anywhere in the address space. Programs can be statically or
dynamically linked, but building of shared libraries are not
supported with the medium model.
`-mcmodel=large'
Generate code for the large model: This model makes no assumptions
about addresses and sizes of sections.
Vous noterez que les pointeurs sont en 64 bits dans tous les cas; et il n'y a aucun intérêt à avoir des pointeurs 64 bits mais pas des tailles 64 bits, après tout.
il doit varier selon l'architecture car il représente la taille de tout objet. Donc, sur un système 32 bits size_t
aura probablement une largeur d'au moins 32 bits. Sur un système 64 bits, sa largeur sera probablement d'au moins 64 bits.
EDIT: Merci pour les commentaires - je l'ai recherché dans le norme C99 , qui dit dans la section 6.5.3.4:
La valeur du résultat est définie par l'implémentation et son type (un type entier non signé ) est
size_t
, défini dans<stddef.h>
(et autres en-têtes)
Donc, la taille de size_t
n'est pas spécifié, seulement qu'il doit être un type entier non signé. Cependant, une spécification intéressante peut être trouvée dans le chapitre 7.18.3 de la norme:
limite de
size_t
SIZE_MAX 65535
Ce qui signifie essentiellement que, quelle que soit la taille de size_t
, la plage de valeurs autorisée est comprise entre 0 et 65 535, le reste dépend de l'implémentation.
size_t est normalement 64 bits sur une machine 64 bits