Pagina 1 di 1

[C++] Complessità dei cast

Inviato: domenica 21 febbraio 2010, 23:24
da Spiros
In una libreria che sto scrivendo una classe si trova (o si potrebbe trovare) ad eseguire molti cast sui pointer. In particolare ho degli array dinamici che possono essere di molteplici tipi (di molteplici classi). Il fatto è che ogni array in realtà contiene solo elementi di un determinato tipo, ma questo tipo non e conosciuto a compile-time, per cui mi vedo costretto a trovare delle soluzioni che però non compromettano l'efficienza della libreria, che è di primaria importanza. Per cui chiedo se qualcuno di voi conosca la complessità dei due cast che potrei usare, ossia lo static_cast e il reinterpret_cast, entrambi applicati su dei pointer.

Per fare un esempio di ciò che devo fare: immaginiamo di avere un array di float (quindi 32 bit per elemento), ma di doverlo usare in realtà per elementi di tipo int32_t (stessa dimensione, ma significato completamente diverso):

Codice: Seleziona tutto

float *my_array = new float[100];
int32_t *my_array_int1 =       static_cast<int32_t*>(my_array);
int32_t *my_array_int2 = reinterpret_cast<int32_t*>(my_array);
La domanda è: quanto "pesanti" sono queste operazioni? Sono effettivamente equivalenti, nella pratica? Qual è la più efficiente? Il fatto di applicare decine di migliaia di volte un cast di questi tipi in un programma lo rallenta di parecchio?

Il fatto che debba usare soltanto tipi numerici di base (dal char all'intero di 32 bit e dal float al double) mi permetterebbe di usare per lo stesso compito delle union. Può rivelarsi utile (ossia più performante) un metodo che faccia uso delle union invece che che dei cast espliciti?

Re: [C++] Complessità dei cast

Inviato: martedì 23 febbraio 2010, 9:25
da Dahman
La domanda è: quanto "pesanti" sono queste operazioni? Sono effettivamente equivalenti, nella pratica? Qual è la più efficiente? Il fatto di applicare decine di migliaia di volte un cast di questi tipi in un programma lo rallenta di parecchio?
In realtà non sono equivalenti.
Il static_cast fa solo una conversione che può essere anche implicita ossia se é valida per il compilatore. I due tipi devono essere in relazione fra di loro.
Se qualche adattamento é necessario, lo static_cast lo fa.

Il reinterpret_cast invece converte qualsiasi puntatore in qualsiasi altro (patate in carciofi), fa semplicemente una copia binaria di un puntatore nell'altro. Per questo é considerato più pericoloso.

Quindi io opterei per lo static_cast.

Quanto sono pesanti? sono tutti test che avvengono a compile time, nessun problema sulla velocità di esecuzione.
Il fatto che debba usare soltanto tipi numerici di base (dal char all'intero di 32 bit e dal float al double) mi permetterebbe di usare per lo stesso compito delle union. Può rivelarsi utile (ossia più performante) un metodo che faccia uso delle union invece che che dei cast espliciti?
Non mi é chiaro questo punto.

ciao
dahman

Re: [C++] Complessità dei cast

Inviato: lunedì 1 marzo 2010, 21:05
da Spiros
Intanto grazie, Dahman, per la risposta. Quindi essendo entrambe trasformazioni a compile-time, a run-time non viene fatto praticamente nulla, giusto? E static_cast fa dei controlli a compile-time e cambia quel che deve cambiare, mentre reinterpret_cast fa solo un'operazione binaria senza neanche "pensarci"?

La parte che non hai capito... Beh, è inutile perché intanto non ho neanche più quel tipo di problemi. Ad ogni modo il problema era questo: mettiamo che io abbia un buffer (un array dinamico) in cui non so a priori (a compile-time) il tipo di dato che ci devo scrivere, ma so che si tratta di int, di unsigned, di float o di double. Potrei allocare la dimensione giusta e poi fare il cast necessario, oppure usare gli union e fare quindi un array di union. Dove ovviamente ogni union contiene un double, un float, un int,... In realtà vista così non ha senso, questa soluzione, perché quella del cast sembra molto migliore, ma per il tipo di operazioni che dovevo fare poteva essere una valida alternativa. La domanda era: lavorare con le union ha invece un impatto sulla velocità di esecuzione?

Re: [C++] Complessità dei cast

Inviato: lunedì 1 marzo 2010, 22:48
da tomallevi
scusate l'intromissione...
se vuoi vedere la prestazione di una scelta puoi fare 2 programmi esplicativi distinti, uno che usa una soluzione l'altro che ne usa un'altra. poi esegui col comando

Codice: Seleziona tutto

time nomeprogramma
un consiglio è quello di far eseguire al programma una decina di migliaia di volte la stessa operazione (dentro un banalissimo for) così la differenza di tempo di esecuzione è un evidente  :P

Re: [C++] Complessità dei cast

Inviato: martedì 2 marzo 2010, 13:38
da Spiros
@tomallevi: per misurare la "lentezza" di un'operazione è meglio fare il timing all'interno del programma, tramite le funzioni messe a disposizione del C++, non tramite un cronometro del sistema operativo.
Ad ogni modo a me quell'informazione di per sé non basta, avrei bisogno di sapere tecnicamente come lavorano, che operazioni fanno i vari cast, in particolare a run-time, ma anche a compile-time.
Comunque grazie.  :D

Re: [C++] Complessità dei cast

Inviato: martedì 2 marzo 2010, 23:50
da l3on4rdo
se aspetti che mi leggo altri 9 capitoli del manuale, in modo da arrivare proprio a questo che stai chiedendo, provo a vedere se posso dare una mano.
se invece hai fretta, prova a darmi un paio di dritte su cosa potrei guardare sull'indice (analitico) magari del libro per poi dirti qualcosa di impreciso nel frattempo.

ciao

Re: [C++] Complessità dei cast

Inviato: mercoledì 3 marzo 2010, 17:32
da Spiros
l3on4rdo ha scritto: se aspetti che mi leggo altri 9 capitoli del manuale, in modo da arrivare proprio a questo che stai chiedendo, provo a vedere se posso dare una mano.
se invece hai fretta, prova a darmi un paio di dritte su cosa potrei guardare sull'indice (analitico) magari del libro per poi dirti qualcosa di impreciso nel frattempo.
Ti ringrazio per la disponibilità, ma dubito che questo argomento venga trattato approfonditamente, se è un manuale per principianti (di che libro si tratta?). Ad ogni modo tentar non nuoce: se ti va di dare un'occhiata nel capitolo in cui tratta i cast (nell'indice analitico è sicuramente indicato, magari con il nome italiano "conversioni" o simili).

Comunque Dahman ha già risposto in modo soddisfacente alla domanda. Altre informazioni sono ben accette, ma non c'è urgenza!

Re: [C++] Complessità dei cast

Inviato: mercoledì 3 marzo 2010, 17:35
da l3on4rdo
non è un manuale per principianti e in ogni modo la mia disponibilità si allargava alla consultazione di tutto lo scaffale 005 della biblioteca di scienze matematiche fisiche e naturali.
non avevo notato che ti hanno risposto.
se trovo qualcosa ti faccio sapere.

ciao