Vorrei dire che "la conversione tra i tipi" è ciò che dovremmo guardare, non se esiste un cast o meno. Ad esempio
int a = 10;
float b = a;
sarà lo stesso:
int a = 10;
float b = (float)a;
Ciò vale anche per cambiare la dimensione di un tipo, ad esempio
char c = 'a';
int b = c;
questo "estenderà c
in una dimensione int
da un singolo byte [utilizzando byte nel senso C, non 8 bit senso]", che potenzialmente aggiungere un'istruzione supplementare (o clockcycle supplementare (s) alle istruzioni utilizzate) sopra e oltre il datamovement stesso.
Si noti che a volte queste conversioni non sono affatto ovvi. Su x86-64, un tipico esempio sta usando int
invece di unsigned int
per gli indici negli array. Poiché i puntatori sono a 64 bit, l'indice deve essere convertito in 64 bit. Nel caso di un unsigned, è banale: basta usare la versione a 64 bit del registro il valore è già in, poiché un'operazione di caricamento a 32 bit riempirà a zero la parte superiore del registro. Ma se hai uno int
, potrebbe essere negativo. Quindi il compilatore dovrà usare l'istruzione "sign estendere questo a 64 bit". Questo in genere non è un problema in cui l'indice viene calcolato in base a un ciclo fisso e tutti i valori sono positivi, ma se si chiama una funzione in cui non è chiaro se il parametro è positivo o negativo, il compilatore dovrà sicuramente estendere il valore . Allo stesso modo, se una funzione restituisce un valore che viene utilizzato come indice.
Tuttavia, qualsiasi compilatore ragionevolmente competente non aggiungerà le istruzioni per convertire qualcosa dal proprio tipo a se stesso (probabilmente se l'ottimizzazione è disattivata, potrebbe farlo - ma l'ottimizzazione minima dovrebbe vedere che "stiamo convertendo da tipo X digitare X, ciò non significa nulla, portarlo via ").
Quindi, in breve, l'esempio sopra riportato non aggiunge penalità extra, ma ci sono certamente casi in cui "la conversione di dati da un tipo all'altro aggiunge istruzioni e/o clockcycles al codice".
fonte
2013-05-14 11:13:25
Dipende dal tipo di getto. –
Dato che hai codificato questo C++, suggerirei l'uso del cast di stile C++, ovvero 'static_cast', 'dynamic_cast ', 'reinterpret_cast ' e 'const_cast '. –
JBL
Anche escludendo tutti i dettagli relativi alla lingua e le minuzie, se un cast è "libero" o meno è probabilmente molto dipendente dalla piattaforma. Ad esempio, su x86, la maggior parte dei cast interi da più grandi a più piccoli sono gratuiti, ma questo potrebbe non essere il caso su un'altra piattaforma con caratteristiche diverse. – yzt