2010-10-14 12 views
6

stdint.h in C99 offre molte opzioni per dimensioni, tipi e intervalli interi: così tanti non so quali scegliere!Scelta della dimensione/intervallo intero più adatto da utilizzare per le variabili

Conosco lo how to use size_t and ptrdiff_t quando appropriato e utilizzo tipi di dimensioni fisse per la memorizzazione e la trasmissione. La mia domanda riguarda i valori che verranno memorizzati solo nella memoria della macchina host.

Per esempio, una struttura per l'immagine potrebbe contenere questi membri:

struct image { 
    integer width, height; /* pixel dimensions of the image */ 
    integer bits_per_pixel; 
    ... 
}; 

Se width e height non potrà mai superare i SHRT_MAX, dovrebbe un short essere usato, o bastone con int? Un'immagine non può avere larghezza o altezza negative, quindi usa un tipo senza segno? Forse (u)int_least16_t è la scelta corretta? Qualcos'altro?

Se bits_per_pixel sarà mai superare il valore di 64 utilizzo char, unsigned char, uint8_t, int o qualcos'altro?

Cosa utilizzeresti in questo esempio e perché?

In che modo l'architettura CPU in cui verrà eseguito il codice influisce sulla scelta? vale a dire PPC o x86, 32 o 64 bit.
In che modo il dispositivo su cui verrà eseguito il codice influisce sulla scelta? Ad esempio, desktop, telefono, console.
In che modo la scelta si riferisce alle prestazioni e all'ottimizzazione?

La mia domanda in termini semplici è: come scegliere quale numero intero usare?

risposta

4

Direi: non preoccuparti di questo, spesso è una forma di ottimizzazione prematura. Ma le mie regole pratiche sono:

  • Utilizzare il codice int quando possibile. Dovrebbe essere la dimensione naturale della parola della macchina.
  • Utilizzare i tipi unsigned quando è necessario un overflow di integer ben definito.
  • Utilizzare un tipo (u)intX_t quando è necessaria la rappresentazione del complemento a due.
  • Utilizzare unsigned char per array di grandi dimensioni con valori <= UCHAR_MAX.

Attenzione che molti tipi di <stdint.h> sono facoltativi, quindi non è possibile dipendere dalla loro esistenza. POSIX lo rende leggermente migliore.

1

Non ci sono regole rigide.

Se si sceglie un tipo troppo piccolo, è possibile finire per limitare artificialmente i set di dati che il programma può gestire. Troppo grande e la tua performance potrebbe risentirne.

A meno che non stiate correndo verso problemi di prestazioni per il vostro compito specifico, mi piacerebbe decisamente orientarmi verso "troppo grande". Mentre usare un intero per bit/pixel è un po 'sciocco, probabilmente non farà male nulla nel più grande schema di cose.

1

A meno che l'applicazione non richieda molto la memoria, non preoccuparti delle dimensioni e utilizzare int.Usare short o char può causare bug sottili che potrebbero causare problemi in seguito. Inoltre, l'uso di char o short non ti farà guadagnare altri cicli della CPU.

3

Per il tuo esempio, vorrei semplicemente utilizzare int o (forse meglio) unsigned per tutti e tre i campi. Non ha senso usare tipi più piccoli tranne in un array che conterrà migliaia o milioni di elementi; impone solo limiti artificiali.

di rispondere alla domanda più generale, ecco alcune linee guida vado da:

  • Scegliere sempre la signedness corretto per i valori sarai l'archiviazione.
  • Per il conteggio degli oggetti, gli indici, le lunghezze delle stringhe/dati in memoria, ecc. Utilizzare size_t.
  • Per i dati con un determinato intervallo di valori che è necessario memorizzare e dove non sarà necessario memorizzare valori esterni all'intervallo, utilizzare uno dei tipi di numeri fissi in interi da stdint.h (uint8_t, uint16_t , uint32_t, ecc.). Gli esempi comuni di questo tipo di necessità che vengono in mente sono i valori dei pixel, campioni audio e caratteri Unicode (in genere 8, 16 e 32 bit, rispettivamente).
  • Altrimenti, int o unsigned è probabilmente il tipo giusto da utilizzare.
+1

+1 per gli esempi di dati di dimensioni fisse. – schot

Problemi correlati