2010-02-19 10 views
6

Z tego co rozumiem, do 'lotny' modyfikator w C# ma dwa skutki:Przykład "lotności" uniemożliwiający optymalizację kompilatora w języku C#?

  1. Wstawia płoty jako niezbędne dla procesora docelowego
  2. Zapobiega pewne optymalizacje kompilatora

na x86/amd64, (1) jest nieistotny. Te procesory nie wymagają płotów w przypadku lotnej semantyki. (jednak ia64 jest inny).

Tak więc, jesteśmy w dół (2). Ale na przykładach, które próbowałem, lotność nie ma znaczenia dla zespołu jit-ted.

Moje pytanie brzmi: czy możesz podać przykład próbki kodu C#, w której dodanie modyfikatora "lotnego" na polu powoduje, że inny kod zestawu jit-ted?

Odpowiedz

2

Być może this jest tym, czego szukasz.

+0

Fantastyczny, dokładnie tego szukałem! Tutaj lotny rzeczywiście powoduje inny kod zespołu. –

+0

Jeśli ktoś jest ciekawy, bez lotnego modyfikatora, wartość pola zostanie zapisana w pamięci podręcznej. A gdy wartość znajduje się w rejestrze, pętla rdzenia nigdy nie "zauważy" aktualizacji wykonanej przez inny rdzeń. –

1

Marc Gravell ma numer repeatable example, jak brak niestabilnego słowa kluczowego może powodować problemy.

Jest to również omówione here.

Warto zauważyć (jak Marc robi), że optymalizacje kompilatora są widoczne tylko podczas kompilacji w trybie Release.