volatile (C++)

Kwalifikator typu, którego można użyć do deklarowania, że obiekt można zmodyfikować w programie przez sprzęt.

Składnia

volatile declarator ;

Uwagi

Możesz użyć przełącznika /volatile kompilatora, aby zmodyfikować sposób interpretowania tego słowa kluczowego przez kompilator.

Program Visual Studio interpretuje volatile słowo kluczowe inaczej w zależności od architektury docelowej. W przypadku usługi ARM, jeśli nie określono /volatile opcji kompilatora, kompilator działa tak, jakby /volatile:iso został określony. W przypadku architektur innych niż ARM, jeśli nie określono /volatile opcji kompilatora, kompilator wykonuje tak, jakby /volatile:ms zostały określone; w związku z tym w przypadku architektur innych niż ARM zdecydowanie zalecamy określenie /volatile:iso i używanie jawnych elementów pierwotnych synchronizacji i wewnętrznych kompilatora, gdy masz do czynienia z pamięcią współdzieloną między wątkami.

Kwalifikator umożliwia volatile zapewnienie dostępu do lokalizacji pamięci używanych przez procesy asynchroniczne, takie jak procedury obsługi przerwań.

Gdy volatile jest używana w zmiennej, która ma również słowo kluczowe __restrict , volatile ma pierwszeństwo.

Jeśli element struct członkowski jest oznaczony jako volatile, volatile jest propagowany do całej struktury. Jeśli struktura nie ma długości, którą można skopiować na bieżącą architekturę przy użyciu jednej instrukcji, volatile może zostać całkowicie utracona w tej strukturze.

Słowo volatile kluczowe może nie mieć wpływu na pole, jeśli spełniony jest jeden z następujących warunków:

  • Długość pola volatile przekracza maksymalny rozmiar, który można skopiować w bieżącej architekturze przy użyciu jednej instrukcji.

  • Długość najbardziej zewnętrznego obiektu zawierającego structelement lub element członkowski prawdopodobnie zagnieżdżonego structobiektu przekracza maksymalny rozmiar, który można skopiować na bieżącą architekturę przy użyciu jednej instrukcji.

Mimo że procesor nie zmienia kolejności dostępu do pamięci podręcznej, zmienne z możliwością buforowania muszą być oznaczone jako volatile , aby zagwarantować, że kompilator nie zmienia kolejności dostępu do pamięci.

Obiekty zadeklarowane jako volatile nie są używane w niektórych optymalizacjach, ponieważ ich wartości mogą się zmieniać w dowolnym momencie. System zawsze odczytuje bieżącą wartość obiektu volatile, jeśli jest on żądany, nawet jeśli poprzednia instrukcja poprosiła o wartość z tego samego obiektu. Ponadto wartość obiektu jest zapisywana natychmiast przy przypisaniu.

Zgodność ze standardem ISO

Jeśli znasz słowo kluczowe volatile języka C# lub znasz zachowanie volatile we wcześniejszych wersjach kompilatora Microsoft C++ (MSVC), pamiętaj, że słowo kluczowe ISO 11 ISO Standard volatile w języku C++11 jest inne i jest obsługiwane w MSVC, gdy określono opcję kompilatora /volatile:iso . (W przypadku usługi ARM jest ona domyślnie określona). Słowo volatile kluczowe w kodzie ISO 11 języka C++11 ma być używane tylko do dostępu sprzętowego; nie używaj go do komunikacji międzywątkowa. W przypadku komunikacji międzywątkowa należy używać mechanizmów, takich jak std::atomic<T> z standardowej biblioteki języka C++.

Koniec zgodności ze standardem ISO

Specyficzne dla firmy Microsoft

Gdy jest używana opcja kompilatora /volatile:ms — domyślnie gdy architektury inne niż usługa ARM są docelowe — kompilator generuje dodatkowy kod, aby zachować kolejność między odwołaniami do obiektów nietrwałych, a także konserwować kolejność odwołań do innych obiektów globalnych. W szczególności:

  • Zapis w obiekcie volatile (znanym również jako zapis nietrwały) ma semantykę wydania; oznacza to, że odwołanie do obiektu globalnego lub statycznego, który występuje przed zapisem do obiektu volatile w sekwencji instrukcji, przed tym nietrwałym zapisem w skompilowanym pliku binarnym.

  • Odczyt obiektu lotnego (znany również jako odczyt lotny) ma semantyka Uzyskiwanie; oznacza to, że odwołanie do obiektu globalnego lub statycznego, który występuje po odczycie nietrwałej pamięci w sekwencji instrukcji, nastąpi po tym nietrwałym odczycie w skompilowanym pliku binarnym.

Dzięki temu obiekty nietrwałe mogą być używane w przypadku blokad pamięci i wydań w aplikacjach wielowątków.

Uwaga

Gdy opiera się na rozszerzonej gwarancji, która jest zapewniana, gdy jest używana opcja kompilatora /volatile:ms , kod nie jest przenośny.

END Microsoft Specific

Zobacz też

Słowa kluczowe
const
Wskaźniki stałe i nietrwałe