volatile? __cdecl?
-
hallo Leutz,
ich programmiere ja schon ne ganze Weile in C++ und habe da
jetzt mal'n paar Fragen.und zwar frage ich mich, was volatile und __cdecl bewirken.
bei __cdecl glaube ich, hat es was mit den Parametern zu tun, wenn man mehrer
Programmiersprachen kombiniert, die unterschiedliche Aufrufkonventionen haben.
bin mir da aber nicht sicher.und mit volatile kann ich ehrlich gesagt gar nichts anfangen.
also würde mich über Hilfe freuen.
MfG DrakoXP
-
__cdecl ist afaik eine Compiler-Erfindung und kennzeichnet die Aufrufkonvention einer Funktion (Verteilung der Parameter, Aufräumen des Stacks, etc) - daneben gibt es noch __stdcall oder __fastcall.
volatile kennzeichnet, daß eine gegebene Variable sich auch außerhalb des normalen Programmablaufs ändern könnte. Das schaltet z.B. einige Optimierungen aus.
-
das heißt, volatile müsste ich verwenden, wenn ich mit mehreren Threads auf eine globale Variable zugreifen möchte?
-
__cdecl ist ein reservierter Bezeichner. Was er tut, wenn er denn existiert, mußt du den Compilerhersteller fragen
volatile führt dazu, dass Lese- und Schreibzugriffe (was nicht exakt definiert wird) "observable behaviour" darstellen. Somit werden Umordnung oder Eliminierung dieser Vorgänge untereinander entsprechend der "as-if" Regel ausgeschlossen. Das hat primär den Zweck, Veränderungen solcher Variablen, die nicht durch das Programm bewirkt werden (etwa wenn wir irgendwelche Geräte direkt steuern) zu ermöglichen. Die Erklärung von CStoll ist insofern verkehrt herum, denn Letzteres ist Folge und nicht Ursache von Ersterem. Andernfalls kommt man leicht auf den Gedanken, volatile etwa zum Datenaustausch zwischen Threads zu benutzen, dafür ist volatile aber ungeeignet (weil die Einschränkungen zu schwach sind). Im Zusammenhang mit volatile besteht eine Inkompatibilität mit C. In C++ Kann eine Zuweisung zu einer volatile Variablen zu einem Lesevorgang auf dieser Variablen führen.
int a; volatile int b; a = b = 5;In C hat a hier nach der Zuweisung mit Sicherheit den Wert 5. In C++ ist das nicht unbedingt so. Denn hier ist das Ergebnis einer Zuweisung ein lvalue, der rechte Operand dagegen ein rvalue, die nötige Umwandlung von lvalue zu rvalue ist aber das, was für gewöhnlich zu einem Lesevorgang führt.
-
camper schrieb:
Im Zusammenhang mit volatile besteht eine Inkompatibilität mit C. In C++ Kann eine Zuweisung zu einer volatile Variablen zu einem Lesevorgang auf dieser Variablen führen.
int a; volatile int b; a = b = 5;In C hat a hier nach der Zuweisung mit Sicherheit den Wert 5. In C++ ist das nicht unbedingt so. Denn hier ist das Ergebnis einer Zuweisung ein lvalue, der rechte Operand dagegen ein rvalue, die nötige Umwandlung von lvalue zu rvalue ist aber das, was für gewöhnlich zu einem Lesevorgang führt.
Heißt das soviel wie, dass zwischen der Zuweisung von 5 an b und der von b an a sich der Wert von b ändern könnte (außerhalb des Programms) und somit a den neuen Wert von b zugeweisen bekommt wohingegen in C der alte Wert von b (also 5) verwendet werden würde?
-
HumeSikkins schrieb:
camper schrieb:
Im Zusammenhang mit volatile besteht eine Inkompatibilität mit C. In C++ Kann eine Zuweisung zu einer volatile Variablen zu einem Lesevorgang auf dieser Variablen führen.
int a; volatile int b; a = b = 5;In C hat a hier nach der Zuweisung mit Sicherheit den Wert 5. In C++ ist das nicht unbedingt so. Denn hier ist das Ergebnis einer Zuweisung ein lvalue, der rechte Operand dagegen ein rvalue, die nötige Umwandlung von lvalue zu rvalue ist aber das, was für gewöhnlich zu einem Lesevorgang führt.
Heißt das soviel wie, dass zwischen der Zuweisung von 5 an b und der von b an a sich der Wert von b ändern könnte (außerhalb des Programms) und somit a den neuen Wert von b zugeweisen bekommt wohingegen in C der alte Wert von b (also 5) verwendet werden würde?
Genau das. Der Wert 5 wird b zugewiesen und danach wird b gelesen um den Wert für die Zuweisung an a zu bestimmen. Könnte der Compiler beweisen, dass sich b nicht ändern wird (typisch für automatische Variablen, auf die keine externe Referenz existiert), wäre es natürlich trotzdem denkbar, dass sich der resultierende Maschinencode nicht von dem ohne volatile unterscheidet. Hier macht sich die fehlende Festlegung, was genau denn nun Lese- und Schreibvorgänge sind, bemerkbar.
-
okay, danke, ich glaube ich hab system mit volatile jetzt verstanden.