2010-08-26 17 views
33

La mia comprensione è che C++ reinterpret_cast e cast di puntatore C è semplicemente una una funzionalità in fase di compilazione e che non ha alcun costo di prestazioni.reinterpret_cast costo del cast

È vero?

risposta

49

È una buona ipotesi per iniziare. Tuttavia, l'ottimizzatore può essere limitato in ciò che può assumere in presenza di un cast puntatore reinterpret_cast<> o C. Quindi, anche se il cast stesso non ha istruzioni associate, il codice risultante è più lento.

Ad esempio, se si esegue il cast di un int su un puntatore, l'ottimizzatore probabilmente non avrà idea di cosa potrebbe puntare il puntatore. Di conseguenza, probabilmente deve presumere che una scrittura attraverso quel puntatore possa cambiare qualsiasi variabile. Questo batte ottimizzazioni molto comuni come la memorizzazione di variabili nei registri.

+1

Non credo che "di solito non" fosse la risposta che intendevi per la domanda "è vero?" –

+0

@Rob Kennedy: Eh, si. Riformulato. – MSalters

+1

grazie mille per questa risposta. Forse in quel caso si può suggerire GCC con la parola chiave register (!?). – fulmicoton

0

Sì, questo è vero. Il tipo di trasmissione che ha un costo di runtime è dynamic_cast.

+2

'static_cast' può anche avere un costo di runtime; anche se di solito è solo un singolo aggiustamento puntatore, o un codice per nascondere un tipo a un altro (come un 'int' in un' float') –

+0

Non '' static_cast' chiama anche le conversioni definite dall'utente? Il costo di runtime su quelli è illimitato. –

+0

Giusto, static_cast ha un costo di runtime nel caso di conversione di tipo (non puntatore). Il mio punto è che dynamic_cast è l'unico tipo di cast che ha costi di runtime aggiuntivi, relativamente al cast di C. –

5

Proprio così. Nessun costo diverso da qualsiasi guadagno/perdita di prestazioni per le istruzioni di esecuzione nella nuova larghezza, che potrei aggiungere, è solo una preoccupazione in rari casi. Il casting tra i puntatori di tutte le piattaforme di cui ho sentito parlare ha un costo zero e nessun cambiamento delle prestazioni.

0

Hai ragione, ma pensaci: reinterpret_cast significa forse un cattivo design o che stai facendo qualcosa di molto basso livello.

dinamico-cast invece ti costerà qualcosa, perché deve cercare in una tabella di ricerca in fase di esecuzione.

+0

'dynamic_cast' è più simile a' static_cast' con il controllo di runtime piuttosto che 'reinterpret_cast'. Non è possibile eseguire il cast di tipi polimorfici con 'reinterpreT_cast'. –

+1

@Billy ONeal: è possibile ma non in modo polimorfo. –

0

reinterpret_cast non comporta costi di runtime .. tuttavia è necessario fare attenzione, poiché ogni utilizzo di reinterpret_cast è definito dall'implementazione. Ad esempio, è possibile reinterpretare una matrice char come una matrice int potrebbe causare l'interruzione di un interrupt dell'architettura di destinazione, poiché diversi tipi potrebbero avere regole di allineamento diverse.

Prima di iniziare, quindi preoccuparsi dell'efficienza.

4

I cast di stile C in C++ tentano prima un static_cast e eseguono un reinterpret_cast solo se non è possibile eseguire un cast statico. Un static_cast può modificare il valore del puntatore nel caso di ereditarietà multipla (o quando si esegue il casting di un'interfaccia su un tipo concreto), questo calcolo dell'offset può comportare un'istruzione extra della macchina. Questo sarà al massimo 1 istruzione della macchina quindi davvero molto piccola.

Problemi correlati