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
struct
element lub element członkowski prawdopodobnie zagnieżdżonegostruct
obiektu 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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla