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?

È stato utile?

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:

  1. 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.
  2. sizeof(size_t) è un numero definito dall'implementazione di byte così memcpy'ing o assegnazione in qualunque tipo intero diverso da uintmax_t è una cattiva idea. Io non sono nemmeno sicuro che sia lecito ritenere che si tratta di dimensioni uguali o inferiori rispetto uintmax_t.
  3. Scrivi valore size_t in un file binario e la lettura di nuovo in un size_t da un altro processo, su una macchina diversa, o da qualcosa compilato con diverse opzioni del compilatore può essere pericoloso per la salute.
  4. L'invio di un valore size_t attraverso una rete e cercando di ricevere utilizzando un buffer sizeof(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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top