volatile (C++)
Kvalifikátor typu, který je možné použít k deklarování, zda může být objekt v programu modifikován hardware.
volatile declarator ;
Poznámky
Pro úpravu, jakým způsobem má toto klíčové slovo kompilátor interpretovat, lze použít přepínač kompilátoru /volatile .
Aplikace Visual Studio interpretuje klíčové slovo volatile odlišně v závislosti na cílové architektuře.Architektura ARM: Pokud není zadána žádná možnost kompilátoru /volatile, provádí kompilátor vykonávání, jako kdyby byly možnosti /volatile:iso zadány.Pro jiné architektury než ARM: Pokud není zadána žádná možnost kompilátoru /volatile, provádí kompilátor vykonávání, jako kdyby byly možnosti /volatile:ms zadány, a proto je pro architektury jiné než ARM důrazně doporučeno při pracování s pamětí, která je sdílená napříč vlákny, zadat /volatile:iso a použít explicitní synchronizační primitiva a vnitřní objekty překladače.
Kvalifikátor volatile lze použít pro poskytnutí přístupu k umístěním v paměti, která jsou používána asynchronními procesy, jako jsou obslužné rutiny přerušení.
Při použití volatile na proměnnou, která má také klíčové slovo __restrict, má volatile přednost.
Pokud je člen struct označen jako volatile, pak je volatile rozšířen do celé struktury.Pokud struktura nemá délku, kterou lze zkopírovat na aktuální architekturu použitím jedné instrukce, může na této struktuře dojít ke kompletní ztrátě volatile.
Pokud platí jedna z následujících podmínek, nemusí mít klíčové slovo volatile žádný vliv na pole:
Délka přechodného pole překračuje maximální velikost, kterou lze na aktuální architektuře zkopírovat pomocí jedné instrukce.
Délka nejvzdálenějších obsahující struct, nebo pokud se jedná o člena případně vnořené struct - překračuje maximální velikost, kterou lze na aktuální architektuře zkopírovat pomocí jedné instrukce.
Ačkoli procesor nemění pořadí přístupů k paměti, které nelze uložit do vyrovnávací paměti, musí být proměnné, které nelze uložit do vyrovnávací paměti, označeny jako volatile k zajištění, aby kompilátor nezměnil pořadí přístupů k paměti.
Objekty, které jsou deklarovány jako volatile, nejsou u určitých optimalizací použity, protože jejich hodnoty se mohou kdykoli změnit. Systém vždy přečte při požadavku aktuální hodnotu přechodného objektu, i když se předchozí instrukce dotázala na hodnotu ze stejného objektu. Platí také, že při přiřazení je hodnota objektu okamžitě zapsána.
Odpovídající specifikaci ISO
Pokud jste obeznámeni s klíčovým slovem C# volatile nebo znáte chování volatile z dřívějších verzí jazyka Visual C++, uvědomte si, že se klíčové slovo volatile specifikace ISO jazyka C++11 liší a je podporováno aplikací Visual Studio, je-li zadána možnost kompilátoru /volatile:iso . (Pro architekturu ARM, je zadáno jako výchozí).Klíčové slovo volatile má být standardu ISO jazyka C++11 použito pouze pro přístup k hardware. Nepoužívejte jej pro komunikaci mezi vlákny.Pro komunikaci mezi vlákny je třeba použít mechanismy jako například std::atomic<T> ze Standardní knihovny šablon jazyka C++.
Specifické pro Microsoft
Je-li použita možnost kompilátoru /volatile:ms - pokud jsou ve výchozím nastavení zaměřeny architektury jiné než ARM – generuje kompilátor kromě zachování řazení referencí na ostatní globální objekty také kód navíc pro zachování pořadí mezi odkazy na přechodné objekty.Zejména:
Zápis do přechodného objektu (označovaný také jako přechodný zápis) má sémantiku vydání. To je odkaz na globální nebo statický objekt, který v sekvenci instrukce předchází zápisu do přechodného objektu, který ve zkompilovaném binárním souboru předchází zápisu do přechodného objektu.
Čtení přechodného objektu (označované také jako přechodné čtení) má sémantiku vydání. To je odkaz na globální nebo statický objekt, který v sekvenci instrukce předchází čtení z přechodného objektu, který ve zkompilovaném binárním souboru předchází čtení z přechodného objektu.
Díky tomu je ve vícevláknových aplikacích možné použít přechodné objekty pro uzamčení a uvolnění paměti.
[!POZNÁMKA]
Při spolehnutí na rozšířenou záruku poskytnutou použitou možností kompilátoru /volatile:ms, není kód přenositelný.