Was sind Volatile-Variablen?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Das stammt aus der Zeit, als man Compilern beigebracht hat, Algorithmen zu optimieren.

Z. B. wird eine Variable, für die es in einer Schleife keine Zuweisung (und keinen Prozeduraufruf mit einem Argument, das ein Pointer auf diese Variable ist), innerhalb diese Schleife als Konstante behandelt. Das hat dann auch Auswirkungen auf Verzweigungen, Abbruchbedingungen etc. (Nicht verwendete Variablen wurden komplett entfernt.) Z. B. wird

int i;
int v = 0;

for (i = 0; i < 10; i++) {
  if (v) { // Abkürzung für if (v != 0)
    break;
  }
  //  do something
}

kompiliert als

int i;

for (i = 0; i < 10; i++) {
  //  do something
}

Jetzt brauchen wir noch eine andere Information. Bausteine, die Informationen von außen entgegennehmen, werden (oder wurden zumindest damals) vom Prozessor wie Speicher angesprochen. Wenn man jetzt z. B. eine Schalterstellung abgefragt hat, hat man eine bestimmte "Speicher"-Adresse abgefragt. Wenn jetzt in obigem Beispiel v für einen Schalter steht, wird dieser Schalter nie abgefragt. Um das zu vermeiden, sagt man dem Compiler, dass die Variable von außen geändert werden kann; hierzu verwendet man das Schlüsselwort "volatile":

int i;
volatile int v = 0;

for (i = 0; i < 10; i++) {
  if (v) { // Abkürzung für if (v != 0)
    break;
  }
  //  do something
}

Jetzt optimiert der Compiler die Variable v nicht mehr weg.

Siehe

https://de.wikipedia.org/wiki/Volatile_(Informatik)

https://stackoverflow.com/questions/246127/why-is-volatile-needed-in-c


PWolff  30.05.2025, 14:04

Sorry, ich habe hier noch einen Fehler drin - die Variable v muss natürlich dort liegen, wo die Information für die Schalterstellung bereitgestellt wird. Soweit ich mich erinnere (hab mich seit Jahren nicht mehr ernsthaft mit C beschäftigt) etwa so:

int* v = &schalter;

Variablen, deren Wert nicht dauerhaft der gleiche, bzw. flüchtig ist (beispielsweise ist RAM ein volatiler Speicher, ein EEPROM ein Non-Volatiler = nichtflüchtiger Speicher).

Wenn du aber das Schlüsselwort bei der Variableninitialisierung meinst, dann bezieht sich das auf die Compiler-Optimierung, die für diese Variable nicht angewendet werden darf.

Beispiel:

volatile int i = 0;

Der Compiler könnte die Variable "i" wegoptimieren, wenn er der Meinung ist, sie wird nicht benötigt.

https://de.wikipedia.org/wiki/Volatile_(Informatik)

In C# wird das verwendet, um explizit klarzumachen, dass eine Variable von mehreren Threads verwendet werden wird. Dann wird sie von einigen Optimierungen ausgenommen, damit die Ergebnisse konsistent sind.