web-dev-qa-db-fra.com

Quelle est la taille de (size_t) sur 32 bits par rapport aux différents modèles de données 64 bits?

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:

modèles de données 64 bits sur Wikipedia

42
anonymous

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.

52
bdonlan

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.

10
Evan Teran

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.

4
beef2k

size_t est normalement 64 bits sur une machine 64 bits

4
adwords