2012-12-28 2 views
6

Possible en double:
size_t vs. intptr_tEst-ce que uintptr_t et size_t sont les mêmes?

Certains de mes offres de code avec des pointeurs et prend uintptr_t en entrée car il doit travailler avec des pointeurs.

Je dois maintenant faire la même chose avec les entiers, donc je veux réutiliser ce code.

Est-ce que size_t est identique à uintptr_t? Puis-je modifier l'implémentation et utiliser le même code pour les pointeurs et les entiers en remplaçant simplement uintptr_t par size_t?

Répondre

15

size_t doit être assez grand pour contenir la taille du plus grand objet possible. uintptr_t doit être assez grand pour contenir un pointeur. Compte tenu de cela, il est plus ou moins garanti que sizeof(uintptr_t) >= sizeof(size_t) (puisque tous les octets dans le plus grand objet possible doit être adressable), mais pas plus. Sur les machines à adressage linéaire, elles seront probablement de la même taille. Sur les architectures segmentées, d'autre part, il est habituel pour uintptr_t d'être plus grand que size_t, puisqu'un objet doit être dans un seul segment, mais un pointeur doit pouvoir pour adresser toute la mémoire.

2

Cela dépend de l'implémentation (et cela inclut le processeur, l'ABI, le compilateur, les bibliothèques standard). Vous n'avez aucune garantie que size_t est la même que uintptr_t; mais cela peut arriver (sur Linux x86 32 bits ou ARM, les deux sont des entiers non signés de 32 bits).

Et l'intention de size_t doit être une taille (notamment de morceaux de mémoire alloués), alors que l'intention de uintptr_t doit être un entier non signé de la même taille de bit que les pointeurs.

-1

Différents compilateurs ont un résultat différent. Si vous voulez qu'ils aient le même effet, vous devez vous assurer que votre compilateur devrait être sur Linux x86 ou ARM 32 bits, et ce sera le cas.

Questions connexes