2010-02-19 6 views
6

D'après ce que je comprends, le modificateur 'volatile' en C# a deux effets:Exemple de 'volatile' empêchant une optimisation du compilateur en C#?

  1. Inserts clôtures comme nécessaires pour le processeur cible
  2. Prévient certaines optimisations du compilateur

x86/AMD64, (1) n'est pas pertinent. Ces processeurs n'ont pas besoin de clôtures pour les sémantiques volatiles. (ia64 est différent, cependant.)

Donc, nous sommes à (2). Mais, pour les exemples que j'ai essayé, volatile ne fait aucune différence pour l'assemblage jit-ted.

Ma question est: Pouvez-vous donner un exemple d'un exemple de code C# où l'ajout d'un modificateur 'volatile' sur un champ donne un code d'assemblage jit-ted différent?

Répondre

2

Peut-être que this est ce que vous cherchez.

+0

Super, c'est exactement ce que je cherchais! Ici, la volatilité résulte en effet en un code d'assemblage différent. –

+0

Dans le cas où quelqu'un est curieux, sans un modificateur volatile, la valeur du champ est mise en cache dans un registre. Et, lorsque la valeur est dans un registre, le noyau en boucle ne "notera" jamais la mise à jour faite par un autre noyau. –

1

Marc Gravell a un repeatable example de la façon dont l'absence d'un mot-clé volatile peut causer des problèmes.

Il est également discuté here.

Il est intéressant de noter (comme Marc) que les optimisations du compilateur ne sont visibles que lorsqu'elles sont compilées en mode Release.