2016-05-18 16 views
6

Ho visto persone consigliare di evitare il typecasting delle variabili il più possibile nelle applicazioni ad alte prestazioni. Non ho mai capito la ragione di questo e tendo a digitare molte volte soprattutto per evitare l'avvertimento del compilatore. Questo ha delle implicazioni sulle prestazioni? Codice comunemente visto:overhead delle prestazioni delle variabili di typecasting in C

1) struct X * passaggio ad una funzione che prende void *

2) uint16_t typecasted a uint32_t

+0

Il casting dei tipi viene eseguito principalmente durante la compilazione (non sono sicuro di virgola fissa e virgola mobile, e viceversa, ma sicuramente per i tipi di puntatore), quindi non ci sono implicazioni di runtime. –

+0

Il buon senso suggerisce che la conversione da/verso virgola mobile debba richiedere alcuni cicli della CPU ... –

+0

@iharob: hai cancellato la tua risposta, quindi farò riferimento al tuo ultimo commento qui. I tipi a virgola mobile sono tipicamente rappresentati nel formato IEEE-754 (non sono sicuro che lo standard C-language lo imponga o meno). Ad esempio, 4.0 e 4 sono potenzialmente rappresentati con "bit completamente diversi". Quindi il casting tra loro richiede una sorta di operazione che verrebbe eseguita durante il runtime. –

risposta

9

fa [casting] avere implicazioni sulle prestazioni?

Non direttamente. Un cast di tipo esprime una conversione esplicita di un valore da un tipo di dati a un altro. È davvero la conversione che ha il potenziale per un impatto sulle prestazioni, e se una tale conversione verrà eseguita indipendentemente dal fatto che tu lanci o meno, il cast non ha alcun impatto sulle prestazioni.

Ad esempio, alcuni compilatori possono essere impostati per avvertire le conversioni implicite da tipi a virgola mobile a tipi interi e spesso questi avvisi possono essere disattivati ​​rendendo esplicita la conversione con un cast. Ciò non cambia il fatto che verrà eseguita una conversione e che tali conversioni non sono gratuite, ma il cast non rende la conversione più costosa di quanto sarebbe altrimenti.

Inoltre, alcune conversioni possono essere implementate gratuitamente. Ad esempio, sulla maggior parte delle macchine, i tipi interi con segno e senza segno con la stessa larghezza hanno rappresentazioni compatibili, quindi la conversione di valori tra questi tipi è un non operativo. Anche i cast che aggiungono o rimuovono i qualificatori di tipo diversi da _Atomic appartengono a questa categoria.

Con riferimento ai particolari esempi:

1) struct X * passaggio una funzione che prende void *

C non richiede rappresentazioni compatibili per diversi tipi di puntatore, ma in pratica è raro in questi giorni per diversi tipi di puntatore a oggetti di avere rappresentazioni diverse. Pertanto, le conversioni tra i tipi di puntatore sono generalmente gratuite. Ciò non ha importanza, tuttavia, perché il caso specifico che si pone è quello in cui la conversione verrà eseguita sia che si inserisca un cast esplicito o meno.

2) uint16_t typecasted a uint32_t

Questo può essere libero, a seconda delle circostanze specifiche e attuazione compilatore. Ad esempio, se il valore da convertire era già contenuto in un registro a 32 bit, allora è un no-op. Inoltre, il compilatore potrebbe essere in grado di implementarlo come no-op nell'espressione specifica in cui appare. Si noti inoltre che se è uguale a unsigned int, come è comune, la semantica C richiede questa particolare conversione da eseguire di routine nella valutazione delle espressioni aritmetiche, quindi molti di questi rientrano nella categoria di conversioni che si verificheranno sia cast o no.