Est portable size_t?
-
18-09-2019 - |
Question
GCC 4.4.1, C99
J'utilise size_t
et size_t
est un unsigned int
. Cependant, cela dépend si vous exécutez 32 bits ou 64 bits.
Je vais utiliser size_t
pour stocker la taille d'un tampon.
Je ne pense pas que ce serait très portable en cas d'utilisation dans les architectures.
Juste une question, l'utilisation size_t
soit sur un 32 ou 64 bits. Quelles situations causerait problème le plus grave?
La solution
size_t
est garantie pour être en mesure de tenir le nombre d'octets de tout objet sur votre mise en œuvre.
Voilà pourquoi le type de retour de sizeof
est size_t
.
Alors oui, il est portable.
Autres conseils
Comme d'autres l'ont déjà dit, size_t
est correct et tout à fait acceptable pour mémoriser le résultat de sizeof()
ou la taille d'un objet représentable en octets. Ce que vous devez surveiller est le suivant:
-
size_t
est la même taille que un certain type entier non signé . Il est pas nécessairement le même nombre d'octets que le plus grand entier non signé,unsigned int
,unsigned long
, etc. -
sizeof(size_t)
est un nombre défini par l'implémentation d'octets afinmemcpy
'ing ou en assignant un type entier autre queuintmax_t
est une mauvaise idée. Je ne suis même pas sûr qu'il est raisonnable de supposer qu'il est de taille égale ou inférieure àuintmax_t
. - écriture d'une valeur de
size_t
à un fichier binaire et en les lisant dans unsize_t
par un autre processus, sur une autre machine, ou par quelque chose compilé avec différentes options de compilateur peut être dangereux pour votre santé. - Envoi d'une valeur
size_t
à travers un réseau et d'essayer de recevoir l'aide d'un tampon desizeof(size_t)
de l'autre côté est plutôt dangereux.
Tous ces éléments sont des problèmes standard avec tout autre type entier, sauf unsigned char
. Alors size_t
est tout aussi portable que tout autre type entier.
Il est logique d'utiliser un certain size_t ou ssize_t pour un tampon si vous utilisez malloc () ou lire (). Pour la portabilité utiliser SIZE_MAX, SSIZE_MAX, sizeof (type-in-your-tampon) et% ZD ou% zu printf ().
Vous avez également off_t et ptrdiff_t / ssize_t, qui varient entre les architectures de la même manière.
Si vous les utilisez correctement, ils sont portables entre les architectures. Sur un système 32 bits, ils seront tous 32 bits de large, alors que sur un système 64 bits, ils seront tous 64 bits. C'est ce que vous voulez -. La taille d'un tampon ne peut peut-être plus grande qu'une size_t 32 bits sur un système 32 bits, mais il peut être beaucoup plus grand sur un système 64 bits
Vous ne devez jamais utiliser ints, désire ardemment, ou toute autre chose. En dehors de toute autre chose, la taille d'une longue varie en fonction de la plate-forme (32 bits sur la plupart des systèmes 32 bits, 64 bits sur 64 bits des systèmes Unix, 32 bits sur Windows 64 bits).
Il est difficile de comprendre ce que vous entendez par dans ce cas « portable ». Le terme "portable" permet à plusieurs interprétations différentes sinificantly.
Type size_t
a un but très précis. Il peut contenir la taille d'un objet dans la mise en œuvre donnée. C'est à dire. il est un type qui peut toujours recevoir le résultat de l'opérateur de sizeof()
. Type size_t
n'a pas d'autre but, et dans son application prévue, il est 100% portable, aussi portable que tout peut être.
Quel genre de « portable » vous parlez est, encore une fois, pas clair.
Vous ne devriez pas supposer que size_t est un entier non signé ( voir cette réponse ), mais je pense qu'il est a la même gamme sur les deux architectures.
Cela dépend de ce que vous utilisez pour size_t.
Si vous l'utilisez pour déterminer la taille d'un tampon de mémoire, il sera en sécurité, car size_t est assez grand pour répondre à toute la mémoire d'un ordinateur. Donc, si la mémoire tampon est plus grande que cela, vous avez un problème de toute façon.
Par contre, si vous l'utilisez comme un entier non signé générique pour compter le nombre d'étoiles dans l'univers, par exemple, vous pourriez avoir un problème sur le système 32 bits (pas sûr sur les systèmes 64 bits).
Le seul vrai problème grave avec ce tente d'accéder à un tableau assez grand ou un grand nombre de size_t.
Tout comme juste un pourrait être suffisant « int » régulière sur un 64 bits, mais pourrait causer un accident sur un 32 bits parce que son trop grand pour un int sur un système 32 bits.