Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Een typekwalificatie die u kunt gebruiken om aan te geven dat een object door de hardware kan worden gewijzigd in het programma.
Syntaxis
volatile declarator ;
Opmerkingen
U kunt de schakeloptie /vluchtige compiler gebruiken om te wijzigen hoe de compiler dit trefwoord interpreteert.
Visual Studio interpreteert het volatile trefwoord anders, afhankelijk van de doelarchitectuur. Als er voor ARM geen /vluchtige compileroptie is opgegeven, wordt de compiler uitgevoerd alsof /vluchtig:iso is opgegeven. Voor andere architecturen dan ARM, als er geen /vluchtige compileroptie is opgegeven, wordt de compiler uitgevoerd alsof /vluchtig:ms is opgegeven; Daarom raden we voor andere architecturen dan ARM ten zeerste aan om /volatile:iso op te geven en expliciete synchronisatieprimitief en compilerintrinsiek te gebruiken wanneer u te maken hebt met geheugen dat wordt gedeeld via threads.
U kunt de volatile kwalificatie gebruiken om toegang te bieden tot geheugenlocaties die worden gebruikt door asynchrone processen zoals interrupt-handlers.
Wanneer volatile wordt gebruikt voor een variabele die ook het trefwoord __restrict heeft, volatile heeft deze prioriteit.
Als een struct lid is gemarkeerd als volatile, wordt deze volatile doorgegeven aan de hele structuur. Als een structuur geen lengte heeft die kan worden gekopieerd op de huidige architectuur met behulp van één instructie, volatile kan deze structuur volledig verloren gaan.
Het volatile trefwoord heeft mogelijk geen effect op een veld als aan een van de volgende voorwaarden wordt voldaan:
De lengte van het vluchtige veld overschrijdt de maximale grootte die kan worden gekopieerd op de huidige architectuur met behulp van één instructie.
De lengte van de buitenste bevat
struct(of als het lid is van een mogelijk genestestruct) overschrijdt de maximale grootte die kan worden gekopieerd op de huidige architectuur met behulp van één instructie.
Hoewel de processor de volgorde van niet-cachebare geheugentoegang niet herschikt, moeten niet-cachebare variabelen worden gemarkeerd om volatile te garanderen dat de compiler de volgorde van de toegang tot het geheugen niet herschikt.
Objecten die als zodanig worden gedeclareerd volatile , worden niet gebruikt in bepaalde optimalisaties omdat hun waarden op elk gewenst moment kunnen worden gewijzigd. Het systeem leest altijd de huidige waarde van een vluchtig object wanneer het wordt aangevraagd, zelfs als een vorige instructie om een waarde van hetzelfde object vraagt. Ook wordt de waarde van het object direct bij de toewijzing geschreven.
ISO-conform
Als u bekend bent met het vluchtige trefwoord C# of bekend bent met het gedrag van volatile eerdere versies van de Microsoft C++-compiler (MSVC), moet u er rekening mee houden dat het sleutelwoord C++11 ISO Standard volatile anders is en wordt ondersteund in MSVC wanneer de optie /vluchtig:iso-compiler is opgegeven. (Voor ARM wordt deze standaard opgegeven). Het volatile trefwoord in C++11 ISO-standaardcode moet alleen worden gebruikt voor hardwaretoegang. Gebruik het niet voor communicatie tussen threads. Gebruik voor communicatie tussen threads mechanismen zoals std::atomic<T> uit de C++-standaardbibliotheek.
Einde van ISO-conform
Microsoft-specifieke
Wanneer de optie /vluchtig:ms-compiler wordt gebruikt, standaard wanneer andere architecturen dan ARM zijn gericht, genereert de compiler extra code om de volgorde te behouden tussen verwijzingen naar vluchtige objecten, naast het handhaven van de volgorde van verwijzingen naar andere globale objecten. In het bijzonder:
Een schrijfbewerking naar een vluchtig object (ook wel vluchtige schrijfbewerking genoemd) heeft semantiek vrijgeven; Dat wil gezegd, een verwijzing naar een globaal of statisch object dat plaatsvindt voordat een schrijfbewerking naar een vluchtig object in de instructiesreeks plaatsvindt vóór die vluchtige schrijfbewerking in het gecompileerde binaire bestand.
Een leesbewerking van een vluchtig object (ook wel vluchtig lezen genoemd) heeft Semantiek verkrijgen; Dat wil gezegd: een verwijzing naar een globaal of statisch object dat optreedt na het lezen van vluchtig geheugen in de instructiesreeks, vindt plaats na die vluchtige leesbewerking in het gecompileerde binaire bestand.
Hierdoor kunnen vluchtige objecten worden gebruikt voor geheugenvergrendelingen en releases in multithreaded-toepassingen.
Opmerking
Wanneer deze afhankelijk is van de verbeterde garantie die wordt opgegeven wanneer de optie /volatile:ms compiler wordt gebruikt, is de code niet draagbaar.
Microsoft-specifieke beëindigen