2012-12-28 8 views
6

Powiel możliwe:
size_t vs. intptr_tCzy uintptr_t i size_t same?

Niektóre z moich transakcji kodu z wskaźniki i bierze uintptr_t jako wejście ponieważ musi pracować ze wskaźnikami.

Teraz muszę zrobić to samo z liczbami całkowitymi, więc chcę ponownie użyć tego kodu.

Czy size_t jest takie samo jak uintptr_t? Czy mogę zmienić implementację i użyć tego samego kodu zarówno dla wskaźników, jak i liczb całkowitych, tylko zastępując uintptr_t przez size_t?

Odpowiedz

15

size_t musi być wystarczająco duży, aby pomieścić rozmiar największego możliwego obiektu . uintptr_t musi być na tyle duży, aby zawierał dowolny wskaźnik. Biorąc pod uwagę to, jest mniej lub bardziej pewny, że wszystkie bajty w największy możliwy obiekt muszą być adresowalne), ale nie więcej. W przypadku maszyn z adresowaniem liniowym prawdopodobnie będą one takie same o rozmiarze . Z drugiej strony w przypadku architektur segmentowanych jest tozwykle większe od uintptr_t, aby było większe niż size_t, ponieważ obiekt musi znajdować się w jednym segmencie, ale wskaźnik musi być w stanie adresować całą pamięć.

2

To zależy od implementacji (i obejmuje procesor, ABI, kompilator, standardowe biblioteki). Nie masz żadnej gwarancji, że size_t jest taka sama jak uintptr_t; ale to może się zdarzyć (w przypadku 32-bitowego systemu Linux x86 lub ARM obie są 32-bitowymi liczbami całkowitymi bez znaku).

I intencją size_t ma być rozmiar (w szczególności przydzielonych kawałków pamięci), podczas gdy intencją uintptr_t ma być całkowita liczba bez znaku o tym samym rozmiarze bitowym co wskaźniki.

-1

Różne kompilatory mają różne wyniki. Jeśli chcesz, aby miały ten sam efekt, musisz upewnić się, że twój kompilator powinien być na 32-bitowym systemie Linux x86 lub ARM, i to się zgadza.