530 Stimmen

Warum verwenden wir das Schlüsselwort flüchtig?

Mögliches Duplikat:
Warum gibt es die Flüchtigkeit?

Ich habe es nie benutzt, aber ich frage mich, warum die Leute es benutzen? Was bewirkt es genau? Ich durchsuchte das Forum, ich fand es nur C# oder Java Themen.

0 Stimmen

Dasselbe wie [C++: Wann hat Ihnen das flüchtige Schlüsselwort jemals geholfen? ]( stackoverflow.com/questions/72552/ ).

36 Stimmen

Es handelt sich zwar um ein Duplikat, aber ich denke, dass Nawaz' Antwort viel umfassender und verständlicher ist als die Duplikatfrage.

0 Stimmen

1514voto

Nawaz Punkte 339767

Betrachten Sie diesen Code,

int some_int = 100;

while(some_int == 100)
{
   //your code
}

Wenn dieses Programm kompiliert wird, kann der Compiler diesen Code optimieren, wenn er feststellt, dass das Programm niemals jemals den Versuch unternimmt, den Wert von some_int so dass es verlockend sein könnte, die while Schleife, indem man sie von while(some_int == 100) à etwas was gleichbedeutend ist mit while(true) so dass die Ausführung schnell erfolgen kann (da die Bedingung in while Schleife zu sein scheint true immer). _(wenn der Compiler es nicht optimiert, dann muss er den Wert von some_int und vergleichen es mit 100, in jeder Iteration, was natürlich ein bisschen langsam ist)._

Manchmal kann jedoch eine Optimierung (einiger Teile Ihres Programms) Unerwünschte weil es sein kann, dass jemand anderes den Wert von some_int de außerhalb des Programms, die dem Compiler nicht bekannt sind da er es nicht sehen kann; aber so haben Sie es ja auch entworfen. In diesem Fall würde die Optimierung des Compilers no das gewünschte Ergebnis erzielen!

Um also das gewünschte Ergebnis zu erzielen, müssen Sie den Compiler irgendwie daran hindern, die Optimierung der while Schleife. Das ist der Punkt, an dem die volatile Schlüsselwort seine Rolle spielt. Alles, was Sie tun müssen, ist dies,

volatile int some_int = 100; //note the 'volatile' qualifier now!

Mit anderen Worten: Ich würde das wie folgt erklären:

volatile sagt dem Compiler, dass,

"Hey Compiler, ich bin flüchtig und, weißt du ich kann durch irgendein XYZ verändert werden geändert werden, von dem du nicht einmal etwas weißt. Das XYZ könnte alles Mögliche sein. Vielleicht ein Außerirdischer außerhalb dieses Planeten namens Programm. Vielleicht ein Blitz, eine [ ] mich mutieren. Kann sein. Man weiß nie, wer mich verändern wird! Also O du Ignorant, hör auf, einen allwissenden Gott zu spielen Gott zu spielen, und wage es nicht, den Code zu berühren wo ich anwesend bin. Okay?"

Nun, das ist der Grund volatile verhindert, dass der Compiler den Code optimiert. Suchen Sie nun im Internet nach Beispielen.


Ein Zitat aus dem C++ Standard ($7.1.5.1/8)

[.. Implementierung auf a Optimierung des Objekts weil der Wert des Objekts möglicherweise durch Mittel geändert werden kann, die von einer Implementierung.[...]

Verwandtes Thema:

Wird eine Struktur flüchtig, wenn alle ihre Mitglieder flüchtig sind?

33voto

Ivan Punkte 3479

In der Computerprogrammierung, insbesondere in den Programmiersprachen C, C++ und C#, wird eine Variable oder ein Objekt, das mit dem volatile Schlüsselwort hat in der Regel besondere Eigenschaften in Bezug auf Optimierung und/oder Threading. Generell gilt, dass das volatile Schlüsselwort soll verhindern, dass der (Pseudo-)Compiler Optimierungen auf den Code anwendet, die davon ausgehen, dass sich die Werte von Variablen nicht "von selbst" ändern können. (c) Wikipedia

http://en.wikipedia.org/wiki/Volatile_variable

44 Stimmen

Flüchtig hat nichts mit Fäden zu tun

47 Stimmen

Das Schlüsselwort volatile ist ein Typqualifizierer, mit dem erklärt wird, dass ein Objekt im Programm durch etwas wie das Betriebssystem, die Hardware oder einen gleichzeitig ausgeführten Thread geändert werden kann. (c) MSDN C++ Referenz. ( msdn.microsoft.com/de-us/library/12a04hfd(v=vs.80).aspx ) Aber sicherlich sind msdn und wikipedia falsch, und Sie haben recht.

17 Stimmen

volatile hilft allerdings nicht beim Einfädeln. Flüchtige Lese-/Schreibvorgänge können immer noch in Bezug auf nicht-flüchtige umgeordnet werden, was sie für Threading-Zwecke nutzlos macht. Vielleicht ist Ihnen auch der fette Hinweis "Microsoft Specific" auf der MSDN-Seite aufgefallen. Die Microsoft-Implementierung von volatile bietet zusätzliche Garantien, die über die vom Standard vorgegebenen hinausgehen. Also ja, technisch gesehen ist MSDN falsch. Und es sollte nicht überraschen, dass auch Wikipedia falsch liegen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X