2010-06-12 5 views
11

Ho visto che era possibile farlo ma non capisco l'interesse.Qual è lo scopo di const_cast <> su un volatile?

+0

Stai chiedendo di trasmettere da 'const volatile' a' volatile' o qualcos'altro? –

+0

Come sempre, la pubblicazione di un codice potrebbe aiutare. –

+0

Rimosso il tag C poiché il linguaggio C non ha 'const_cast <>' –

risposta

22

Ecco un Dr. Dobbs article da Andrei Alexandrescu che va in quantità piuttosto osceni di dettagli su di esso.

+0

Questo è un articolo estremamente interessante. Upvoted. – Puppy

+0

Come molte altre cose scritte da Alexandrescu, quell'articolo è illuminante. Ho fatto una domanda su quell'articolo e l'abuso del qualificatore 'volatile' che propone qualche tempo fa http://stackoverflow.com/questions/2491495/may-volatile-be-in-user-defined-types-to- help-writing-thread-safe-code –

+0

Davvero un grande articolo. Grazie per la condivisione. +1. – jweyrich

3

const e volatile come se si riferissero alla stessa idea su una variabile, ma non lo fanno. Una variabile const non può essere modificata dal codice corrente. Una variabile volatile può essere modificata da qualche entità esterna al di fuori del codice corrente. È possibile avere una variabile const volatile - in particolare qualcosa come un registro mappato in memoria - che viene modificata dal computer in un momento in cui il programma non può prevedere, ma che il codice non può cambiare direttamente. È possibile utilizzare const_cast per aggiungere o rimuovere const o volatile ("qualifica cv") a una variabile.

4

const e volatile sono ortogonali.

const significa che i dati sono di sola lettura.

volatile significa che la variabile potrebbe cambiare a causa di motivi esterni, pertanto il compilatore deve leggere la variabile dalla memoria ogni volta che viene fatto riferimento.

Quindi la rimozione di const consente di scrivere quello che altrimenti era un percorso di sola lettura (il codice deve avere una conoscenza speciale della posizione in cui è effettivamente modificabile). Non rimuovere volatile di scriverlo, perché si potrebbe causare un comportamento indefinito (a causa di 7.1.5.1/7 - If an attempt is made to refer to an object defined with a volatile-qualified type through the use of an lvalue with a non-volatile-qualified type, the program behaviour is undefined.)

+2

'const_cast' si applica a' const' e 'volatile', e mentre potenzialmente la rimozione di' volatile' può causare un comportamento indefinito , ci sono casi in cui non è così. Cioè l'aggiunta di barriere di memoria costringerà il compilatore a non memorizzare nella cache la variabile e fornisce una maggiore garanzia di 'volatile' (non solo la variabile non verrà memorizzata nella cache, ma l'istruzione non verrà riordinata al di fuori della sezione critica). –