2012-12-28 18 views
6

Eventuali duplicati:
size_t vs. intptr_tAre uintptr_t e size_t same?

Alcune delle mie offerte di codice con puntatori e prende uintptr_t come input dal momento che deve lavorare con i puntatori.

Ora devo fare la stessa cosa con gli interi, quindi voglio riutilizzare quel codice.

È size_t uguale a uintptr_t? Posso modificare l'implementazione e utilizzare lo stesso codice per entrambi i puntatori e numeri interi semplicemente sostituendo con size_t?

risposta

15

size_t deve essere abbastanza grande da contenere la dimensione del più grande oggetto possibile. uintptr_t deve essere abbastanza grande da contenere qualsiasi puntatore. Detto questo, è più o meno garantito che sizeof(uintptr_t) >= sizeof(size_t) (poiché tutti i byte in l'oggetto più grande possibile devono essere indirizzabili), ma non di più. Sulle macchine con indirizzamento lineare, probabilmente saranno le stesse dimensioni dello . Per le architetture segmentate, invece, è al solito size_t, poiché un oggetto deve trovarsi in un singolo segmento, ma un puntatore deve essere in grado di indirizzare tutta la memoria su .

2

Dipende dall'implementazione (e include il processore, l'ABI, il compilatore, le librerie standard). Non hai alcuna garanzia che lo size_t sia lo stesso di uintptr_t; ma ciò potrebbe accadere (su Linux x86 a 32 bit o ARM, entrambi sono numeri interi senza segno a 32 bit).

E l'intento di size_t deve essere una dimensione (in particolare di blocchi di memoria allocati), mentre l'intento di uintptr_t deve essere un numero intero senza segno della stessa dimensione di bit dei puntatori.

-1

Il compilatore diverso ha risultati diversi. Se si desidera che abbiano lo stesso effetto, è necessario assicurarsi che il compilatore si trovi su Linux x86 a 32 bit o ARM e che funzionerà correttamente.