2013-08-26 12 views
9

È static_cast<T>(...) qualcosa che viene eseguito in fase di compilazione o in fase di esecuzione? Ho cercato su google, ma ho avuto risposte diverse.È statico_cast <T> (...) in fase di compilazione o in fase di esecuzione?

Inoltre, dynamic_cast<T>(...) è ovviamente runtime - ma che dire di reinterpret_cast<T>(...)?

+3

"Statico" ... l'indizio è nel nome. –

+0

static_cast non esegue controlli di runtime. – dare

+2

A giudicare dalle risposte esistenti, la domanda più grande che deve essere decisa qui è ciò che intendi con * "viene fatto in fase di compilazione" *. Mentre la conversione da utilizzare viene scelta in fase di compilazione, la conversione vera e propria può (e in genere lo farà) molto bene il risultato nel codice di conversione che deve essere eseguito in fase di runtime. –

risposta

8

Dipende da cosa stai trasmettendo a cos'altro. Per esempio. static_cast<std::string>("Hello") termina chiamando il costruttore std::string.

Dalla parte superiore della mia testa, non riesco a pensare a casi in cui reinterpret_cast avrebbe bisogno di generare le istruzioni della macchina reale. Sta solo dicendo al compilatore: prendi questo schema di bit e credi che sia un valore di questo tipo.

+0

Oh, interessante. Quali sono le regole per questo? Succede quando lancio un 'int' su un' float'? E quando lancio un 'float' su un' int'? –

+0

Probabilmente entrambi dovrebbero generare alcune istruzioni della macchina, a meno che non si stia eseguendo una costante in fase di compilazione (cioè, scrivendo 'static_cast (42)', il compilatore di solito sarebbe abbastanza intelligente da sostituirlo con '42f' al momento della compilazione). –

+0

Sarebbe ottimizzato con '-O3'? O dovrei usare un 'reinterpret_cast' quando sono sicuro di quello che sto facendo per i cast numerici ad alte prestazioni? –

4

Tempo di compilazione. Infatti, il compilatore non inserisce nemmeno il codice runtime per verificare che il risultato sia corretto. Il compilatore controlla che la conversione sia staticamente possibile, ovviamente. Esempio: casting da una sottoclasse a una superclasse. Se la conversione richiede il richiamo di un builtin o di una funzione di casting, saranno eseguiti in fase di esecuzione, ovviamente, ma non ci sarà alcun tipo di controllo.

+2

Anche il casting dalla sottoclasse alla superclasse può comportare la generazione di codice run-time, ad es. quando detta superclasse è in realtà una classe base virtuale. –

+0

@IgorTandetnik Giusto. Intendevo il codice di controllo dei caratteri. Ho cercato di correggere l'ambiguità (o semplice errore! :-)). –