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 (
struct
nebo je-li členem pravděpodobně vnořenéhostruct
) 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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro