Conoscendo l'intervallo di tipi di variabili necessari

2

Quindi, se io (come programmatore) so che il mio valore non supererà mai un piccolo numero (diciamo 100) perché è in realtà solo un ciclo controlaterale o qualsiasi altra cosa, potrei usare short o char invece di int per il risparmio di memoria minuto?

    
posta floopdagoop 06.08.2014 - 19:50
fonte

3 risposte

7

Puoi, e questo probabilmente funzionerà. Come menzionato FrustratedWithFormsDesigner, dovrai essere sicuro del controllo dei limiti.

Un altro fattore importante è che, come delnan, i registri hanno dimensioni fisse. Ma usarli come un tipo più piccolo può significa usare istruzioni diverse, meno efficienti se la dimensione della variabile non è la dimensione della parola del computer.

La maggior parte delle volte non c'è molto da guadagnare dall'uso di dimensioni variabili inferiori alla dimensione della parola della macchina. I sistemi incorporati potrebbero trarne vantaggio e, se un formato file specifica dimensioni di campo specifiche, ovviamente li utilizzerà. Un'altra cosa da tenere a mente è l'allineamento della memoria, una variabile a 16 bit può essere allineata su un limite di memoria a 32 o 64 bit con spazio inutilizzato tra le variabili. O forse no. O potrebbe essere un flag del compilatore.

Modifica: i commenti hanno sollevato un buon punto. Anche con una dimensione di parola di 64 bit, int è ancora probabilmente 32 bit (C / C ++, piattaforme desktop). Le ragioni sono storiche e fuori contesto qui. Tuttavia, una moderna CPU a 64 bit come Intel Core i7 è strongmente ottimizzata per aritmetica a 32 e a 64 bit. Qualsiasi CPU dovrebbe essere veloce quando si utilizzano inte della stessa dimensione della sua dimensione di parola nativa. Tuttavia, là fuori c'è un lotto di software a 32 bit che queste CPU devono essere in grado di eseguire ed eseguire correttamente. Lavorare con ints più piccoli di 32 bit può o potrebbe richiedere un colpo di prestazioni, dato che ora sei fuori dal regno di ciò per cui è ottimizzata la CPU. In pratica, mi aspetterei che ogni hit della performance fosse minimo e anche la differenza di memoria sarebbe trascurabile. File questo sotto "ottimizzazione prematura".

    
risposta data 06.08.2014 - 20:10
fonte
2

Suppongo che tu possa Ovviamente, se lo fai, dovresti includere anche il codice che convalida la tua variabile in modo che se un è è maggiore di 100, ottieni un messaggio di errore ragionevole. Ed è anche una buona idea aggiungere commenti per spiegare perché stai usando char invece di int (se è quello che stai facendo). Potrebbe non essere ovvio per tutti. Stai lavorando in un ambiente in cui la memoria è così stretta che questo farà una differenza significativa per il tuo programma? Lo stai facendo per motivi educativi?

    
risposta data 06.08.2014 - 19:53
fonte
-2

Questo è particolarmente utile nei cicli for. Le persone spesso usano solo int, o permettono a var di determinare quale dovrebbe essere il tipo di variabile. Questo è inefficiente (ma non così terribilmente), ma per le persone come me che amano ottenere ogni grammo di prestazioni e sono semplicemente solleticati rosa utilizzando il tipo di dati più perfetto per una situazione, questo è fantastico.

for(SByte i = 0; i <= 10; i++)
{
...code
}

SByte consente di -128 a 127. Adoro questo piccolo tipo di dati perché salva in memoria ed è il tipo di dati più appropriato per la situazione in cui è giustificato.

Tuttavia, l'intero, in alcune lingue, è il tipo di dati più veloce per le operazioni aritmetiche, anche quando si tratta di un grande contenitore per ciò di cui si ha bisogno.

Arithmetic operations are faster with integral types than with other data types. They are fastest with the Integer and UInteger types in Visual Basic. 1 (msdn.com)

Quindi, in loop, sì, usa questo. Quando fai l'aritmetica, tuttavia, metti l'aria sul lato della cautela e usa un int a meno che non cerchi la lingua che stai usando per vedere quale sia il tipo più veloce.

- Aggiunta di un altro esempio che ho dato nei commenti -

Hai una classe che contiene 100 interi, ma nessuno degli interi andrà mai sopra il valore 10. Ogni volta che crei un oggetto di quella classe, stai bloccando 32 bit per int creando 32 * 100 = 3200 bit. Se hai sostituito questi valori con sBytes, stai bloccando 8 * 100 = 800. Stai salvando 2400 bit da utilizzare in qualsiasi altro luogo.

    
risposta data 06.08.2014 - 20:20
fonte

Leggi altre domande sui tag