Udostępnij za pośrednictwem


volatile (C++)

Kwalifikator typu, którego możesz użyć, aby zadeklarować, że obiekt może być modyfikowany w programie przez sprzęt.

volatile declarator ;

Uwagi

Możesz użyć przełącznika kompilatora /volatile, aby zmodyfikować sposób, w jaki kompilator interpretuje to słowo kluczowe.

Program Visual Studio interpretuje słowo kluczowe volatile różnie, w zależności od architektury docelowej.Dla architektury ARM, jeśli opcja kompilatora /volatile nie została określona, kompilator wykona swoją pracę tak jakby określona była opcja /volatile:iso.Dla architektury innej niż ARM, jeśli opcja kompilatora /volatile nie została określona, kompilator wykonuje swoją pracę tak, jakby określona była opcja /volatile:ms; z tego powodu, dla architektury innej niż ARM, zdecydowanie zaleca się określenie opcji /volatile:iso i używanie jawnych podstaw synchronizacji oraz wewnętrznych poleceń kompilatora podczas pracy z pamięcią współużytkowaną przez wiele wątków.

Możesz użyć kwalifikatora volatile, aby zapewnić dostęp do lokalizacji pamięci, które są używane przez procesy asynchroniczne, takie jak procedury obsługi przerwań.

Gdy słowo kluczowe volatile jest używane dla zmiennej, dla której jest określone również __restrict, volatile ma pierwszeństwo.

Jeśli element członkowski struct jest oznaczony jako volatile, to volatile jest propagowane na całą strukturę.Jeśli struktura nie ma długości, która może zostać skopiowana na bieżącą architekturę przy użyciu jednej instrukcji, volatile może zostać całkowicie utracone dla tej struktury.

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

  • Długość pola nietrwałego przekracza maksymalny rozmiar, który może zostać skopiowany na bieżącej architekturze przy użyciu jednej instrukcji.

  • Długość zawierającej go, peryferyjnej struct (lub jeśli jest elementem członkowskim prawdopodobnie zagnieżdżonej struct) przekracza maksymalny rozmiar, który może zostać skopiowany na bieżącej architekturze przy użyciu jednej instrukcji.

Mimo że procesor nie zmienia kolejności dostępu do niebuforowanej pamięci, to niebuforowane zmienne muszą zostać oznaczone jako volatile, aby zagwarantować, że kompilator nie zmieni kolejności dostępu do pamięci.

Do obiektów, które zostały zadeklarowane jako volatile nie są używane niektóre optymalizacje, ponieważ ich wartości mogą się zmienić w dowolnym momencie. System zawsze odczytuje bieżącą wartość obiektu nietrwałego, gdy jest to żądane, nawet jeśli poprzednia instrukcja pytała o wartość z tego samego obiektu. Ponadto, wartość obiektu jest zapisywana natychmiast podczas przypisania.

Informacje zgodne z normami ISO

Jeśli znasz słowo kluczowe C# volatile lub zachowanie volatile we wcześniejszych wersjach programu Visual C++, musisz być świadomy, że słowo kluczowe volatile w standardzie ISO C++11 działa inaczej i jest obsługiwane w programie Visual Studio, gdy określona jest opcja kompilatora /volatile:iso. (Dla architektury ARM opcja ta jest określona domyślnie).Słowo kluczowe volatile w standardzie kodu ISO C++11 ma być używane tylko podczas dostępu do sprzętu; nie używaj go do komunikacji między wątkami.Do komunikacji między wątkami, należy użyć mechanizmów takich jak std::atomic<T> z biblioteki standardowych szablonów C++.

Specyficzne dla firmy Microsoft

Gdy użyta jest opcja kompilatora /volatile:ms (domyślnie, gdy docelowa architektura jest inna niż ARM), kompilator generuje dodatkowy kod do zarządzania kolejnością odwołań do obiektów nietrwałych, oprócz zarządzania kolejnością odwołań do innych obiektów globalnych.W szczególności:

  • Zapis do obiektu nietrwałego (nazywany również zapisem nietrwałym) ma semantykę wydania; oznacza to, że odwołanie do obiektu globalnego lub statycznego, które występuje w sekwencji instrukcji przed zapisem do obiektu nietrwałego, w skompilowanym pliku binarnym również wystąpi przed zapisem nietrwałym.

  • Odczyt z obiektu nietrwałego (nazywany również odczytem nietrwałym) ma semantykę pobierania; oznacza to, że odwołanie do obiektu globalnego lub statycznego, które występuje w sekwencji instrukcji po odczycie z pamięci nietrwałej, w skompilowanym pliku binarnym również wystąpi po odczycie nietrwałym.

Umożliwia to użycie obiektów nietrwałych do blokowania i zwalniania pamięci w aplikacjach wielowątkowych.

[!UWAGA]

Kod jest nieprzenośny, jeśli opiera się na zwiększonej gwarancji, dostarczanej przy użyciu opcji kompilatora /volatile:ms.

Zobacz też

Informacje

Słowa kluczowe języka C++

const (C++)

Wskaźniki stałe i nietrwałe