2010-06-12 13 views
11

J'ai vu qu'il était possible de le faire mais je ne comprends pas l'intérêt.Quel est le but de la const_cast <> sur un volatile?

+0

Est-ce que vous posez des questions sur la conversion d'un const volatile en un volatile ou quelque chose d'autre? –

+0

Comme toujours, l'envoi de code aiderait. –

+0

Balise C supprimée car le langage C n'a pas 'const_cast <>' –

Répondre

22

est ici un Dr. Dobbs article par Andrei Alexandrescu qui va dans des quantités plutôt obscènes de détails à ce sujet.

+0

C'est un article extrêmement intéressant. Upvoted. – Puppy

+0

Comme beaucoup d'autres choses qu'Alexandrescu a écrit, cet article est éclairant. J'ai posé une question à propos de cet article et de l'abus du qualificatif "volatile" qu'il propose il y a quelque temps http://stackoverflow.com/questions/2491495/may-volatile-be-in-user-defined-types-to- help-writing-thread-safe-code –

+0

En effet, un super article. Merci d'avoir partagé. +1 – jweyrich

3

const et volatile sonnent comme ils se réfèrent à la même idée sur une variable, mais ils ne le font pas. Une variable const ne peut pas être modifiée par le code actuel. Une variable volatile peut être modifiée par une entité extérieure en dehors du code actuel. Il est possible d'avoir une variable const volatile - en particulier quelque chose comme un registre mappé en mémoire - qui est modifiée par l'ordinateur à un moment que votre programme ne peut pas prédire, mais que votre code n'est pas autorisé à changer directement. Vous pouvez utiliser const_cast pour ajouter ou supprimer const ou volatile ("cv-qualification") à une variable.

4

const et volatile sont orthogonales.

const signifie que les données sont en lecture seule.

volatile signifie que la variable peut être modifiée pour des raisons externes, de sorte que le compilateur doit lire la variable de la mémoire chaque fois qu'elle est référencée.

Ainsi, la suppression de const vous permet d'écrire ce qui était autrement un emplacement en lecture seule (le code doit avoir une connaissance spéciale de l'emplacement réellement modifiable). Vous ne devez pas supprimer volatile d'écrire parce que vous pourriez causer un comportement non défini (en raison de 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' s'applique à la fois à' const' et 'volatile', et même si la suppression potentielle de' volatile' peut entraîner un comportement indéfini , il y a des cas où ce n'est pas le cas. C'est à dire. l'ajout de barrières de mémoire force le compilateur à ne pas mettre en cache la variable et fournit une garantie plus forte que «volatile» (non seulement la variable ne sera pas mise en cache, mais elle ne sera pas réordonnée en dehors de la section critique). –