È portatile size_t?
-
18-09-2019 - |
Domanda
GCC 4.4.1, C99
Sto usando size_t
, e size_t
è un unsigned int
. Tuttavia, questo dipende se si esegue a 32 bit o 64 bit.
Userò size_t
per memorizzare la dimensione di un buffer.
Quindi non credo che questo sarebbe molto portabile se si usa tra architetture.
Solo una domanda, con l'utilizzo di size_t
sia su un 32 o 64 bit. Quali situazioni potrebbe causare il problema più grave?
Soluzione
size_t
è garantito per essere in grado di tenere il numero di byte di qualsiasi oggetto sulla vostra implementazione.
Ecco perché il tipo di ritorno di sizeof
è size_t
.
Quindi sì, è portatile.
Altri suggerimenti
Come altri hanno già detto, size_t
è corretto e perfettamente accettabile per memorizzare il risultato della sizeof()
o la dimensione di qualsiasi oggetto rappresentabile in byte. Quello che hai da guardare fuori per è la seguente:
-
size_t
è la stessa dimensione come qualche tipo intero senza segno . Non è necessariamente lo stesso numero di byte come il più grande tipo intero senza segno,unsigned int
,unsigned long
, ecc. -
sizeof(size_t)
è un numero definito dall'implementazione di byte cosìmemcpy
'ing o assegnazione in qualunque tipo intero diverso dauintmax_t
è una cattiva idea. Io non sono nemmeno sicuro che sia lecito ritenere che si tratta di dimensioni uguali o inferiori rispettouintmax_t
. - Scrivi valore
size_t
in un file binario e la lettura di nuovo in unsize_t
da un altro processo, su una macchina diversa, o da qualcosa compilato con diverse opzioni del compilatore può essere pericoloso per la salute. - L'invio di un valore
size_t
attraverso una rete e cercando di ricevere utilizzando un buffersizeof(size_t)
sull'altro lato è piuttosto pericoloso.
Tutti questi sono problemi standard con qualsiasi altro tipo intero tranne unsigned char
. Così size_t
è altrettanto portatile come qualsiasi altro tipo integer.
Si fa un po 'senso usare size_t o ssize_t per un buffer se si sta utilizzando malloc () o leggere (). Per la portabilità utilizzare SIZE_MAX, SSIZE_MAX, sizeof (type-in-your-buffer) e il% ZD o% zu printf ().
Hai anche avuto off_t e ptrdiff_t / ssize_t, che variano tra le architetture nello stesso modo.
Se si utilizzano correttamente, allora sono le architetture attraverso portatili. In un sistema a 32 bit, saranno tutti larghe 32 bit, mentre in un sistema a 64 bit saranno tutti 64 bits. Questo è ciò che si vuole -. Le dimensioni di un buffer non può assolutamente essere qualsiasi più grande di un size_t a 32 bit su un sistema a 32 bit, ma può essere molto più grande su un sistema a 64 bit
Non si dovrebbe mai usare int, long, o qualsiasi altra cosa. A parte ogni altra cosa, la dimensione di una lunga varia a seconda della piattaforma (32-bit sulla maggior parte dei sistemi a 32 bit, 64-bit su sistemi Unix a 64 bit, 32-bit a 64-bit di Windows).
E 'difficile capire cosa si intende per "portatile" in questo caso. Il termine "portatile" consente a più interpretazioni sinificantly differenti.
Tipo size_t
ha uno scopo ben preciso. Esso può contenere le dimensioni di un oggetto in una data implementazione. Cioè si tratta di un tipo che può sempre ricevere il risultato dell'operatore sizeof()
. Tipo size_t
non ha altro scopo, e nella sua applicazione prevista è portatile al 100%, portatile come tutto può essere.
Che tipo di "portatile" ti stai chiedendo circa è, ancora una volta, non è chiaro.
Non si deve dare per scontato che size_t è un unsigned int ( vedere questa risposta ), ma penso che si ha la stessa gamma su entrambe le architetture.
dipende da ciò che si sta utilizzando per size_t.
Se lo si utilizza per determinare la dimensione di un buffer di memoria sarà sicuro, dal momento che size_t è grande abbastanza per affrontare l'intera memoria di un qualsiasi computer. Quindi, se il buffer di memoria è più grande di quello, hai un problema in ogni caso.
D'altra parte, se lo si utilizza come un numero intero senza segno generico per contare il numero di stelle nell'universo, ad esempio, si potrebbe avere un problema sul sistema a 32 bit (non è sicuro su sistemi a 64-bit).
L'unico vero problema serio con questo sta cercando di accedere a una piuttosto grande array o un gran numero di size_t.
Proprio come solo un normale "int" potrebbe essere sufficiente su un 64-bit, ma potrebbe causare un crash su un 32 bit perché la sua troppo grande per un int su un sistema a 32 bit.