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?

Était-ce utile?

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:

  1. 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.
  2. sizeof(size_t) est un nombre défini par l'implémentation d'octets afin memcpy'ing ou en assignant un type entier autre que uintmax_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.
  3. écriture d'une valeur de size_t à un fichier binaire et en les lisant dans un size_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é.
  4. Envoi d'une valeur size_t à travers un réseau et d'essayer de recevoir l'aide d'un tampon de sizeof(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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top