Sdílet prostřednictvím


volatile (C++)

Kvalifikátor typu, který můžete použít k deklaraci, že objekt lze v programu upravit hardwarem.

Syntaxe

volatile declarator ;

Poznámky

Pomocí přepínače kompilátoru /volatile můžete upravit způsob interpretace tohoto klíčového slova kompilátorem.

Visual Studio interpretuje volatile klíčové slovo odlišně v závislosti na cílové architektuře. Pokud není pro ARM zadána žádná možnost kompilátoru /volatile , kompilátor provede, jako by byl zadán /volatile:iso . U architektur jiných než ARM platí, že pokud není zadána žádná možnost kompilátoru /volatile, kompilátor se provede tak, jako kdyby byl zadán /volatile:ms. Proto pro architektury jiné než ARM důrazně doporučujeme zadat /volatile:iso a použít explicitní synchronizační primitivy a vnitřní prvky kompilátoru při práci s pamětí sdílenou mezi vlákny.

Kvalifikátor můžete použít volatile k zajištění přístupu k umístěním paměti, která používají asynchronní procesy, jako jsou obslužné rutiny přerušení.

Pokud volatile se používá u proměnné, která má také klíčové slovo __restrict , volatile má přednost.

struct Pokud je člen označen jako volatile, pak volatile se rozšíří do celé struktury. Pokud struktura nemá délku, kterou lze zkopírovat v aktuální architektuře pomocí jedné instrukce, volatile může být u této struktury zcela ztracena.

Klíčové volatile slovo nemusí mít žádný vliv na pole, pokud platí jedna z následujících podmínek:

  • Délka nestálého pole překračuje maximální velikost, kterou lze zkopírovat v aktuální architektuře pomocí jedné instrukce.

  • Délka vnějšího obsahu ( structnebo je-li členem pravděpodobně vnořeného struct) překračuje maximální velikost, kterou lze zkopírovat v aktuální architektuře pomocí jedné instrukce.

I když procesor nepřeuspořádá přístup k paměti bez mezipaměti, proměnné, které nelze uložit do mezipaměti, musí být označeny jako volatile záruky, že kompilátor nepřeuspořádá přístup k paměti.

Objekty deklarované jako volatile se v určitých optimalizacích nepoužívají, protože jejich hodnoty se mohou kdykoli změnit. Systém vždy čte aktuální hodnotu nestálého objektu, když je požadován, i když předchozí instrukce požádala o hodnotu ze stejného objektu. Také hodnota objektu je zapsána okamžitě při přiřazení.

Shoda se standardem ISO

Pokud znáte klíčové slovo C# volatile nebo znáte chování volatile v dřívějších verzích kompilátoru Microsoft C++ (MSVC), mějte na paměti, že klíčové slovo standardu volatile ISO C++11 se liší a je podporováno v MSVC, pokud je zadána možnost kompilátoru /volatile:iso . (Pro ARM je ve výchozím nastavení určená). Klíčové volatile slovo v kódu standardu ISO C++11 se používá pouze pro přístup k hardwaru. Nepoužívejte ho pro komunikaci mezi vlákny. Pro komunikaci mezi vlákny použijte mechanismy, jako je std::atomic<T> ze standardní knihovny C++.

Konec shody ISO

Specifické pro Microsoft

Pokud se používá možnost kompilátoru /volatile:ms – ve výchozím nastavení v případě, že jsou cíleny architektury jiné než ARM – kompilátor generuje další kód, který udržuje pořadí mezi odkazy na nestálé objekty kromě zachování pořadí odkazů na jiné globální objekty. Zejména jde o toto:

  • Zápis do nestálého objektu (označovaného také jako nestálé zápis) má sémantiku vydané verze; to znamená, že odkaz na globální nebo statický objekt, ke kterému dochází před zápisem do nestálého objektu v pořadí instrukcí, dojde před tím, než se tento nestálý zápis do kompilovaného binárního souboru.

  • Čtení nestálého objektu (označovaného také jako nestálé čtení) má sémantiku Acquire; to znamená, že odkaz na globální nebo statický objekt, ke kterému dochází po čtení nestálé paměti v pořadí instrukcí, dojde po této nestálé čtení v kompilovaném binárním souboru.

To umožňuje používat nestálé objekty pro zámky paměti a vydané verze ve vícevláknových aplikacích.

Poznámka

Pokud se spoléhá na rozšířenou záruku, která je poskytována při použití parametru /volatile:ms compiler, je kód nepřenosný.

END Microsoft Specific

Viz také

Klíčová slova
const
Ukazatelé const a volatile