2013-05-25 7 views
8

Normalerweise sehe ich den const Spezifizierer, der verwendet wird, um eine konstante Elementfunktion anzuzeigen. Aber was bedeutet es, wenn das Schlüsselwort volatile verwendet wird?Was bedeutet es, wenn eine Mitgliedsfunktion flüchtig ist?

void f() volatile {} 

Das kompiliert für mich gut, aber ich verstehe nicht, wofür das ist. Ich konnte bei meiner Suche keine Informationen darüber finden, daher wird jede Hilfe geschätzt.

Update: Um es klar zu machen, weiß ich, was volatile ist für. Ich weiß einfach nicht, was es in diesem Zusammenhang bedeutet.

Antwort

12

Die volatile Qualifier auf einer Elementfunktion ist analog zu dem const Qualifier. Es ermöglicht die Memberfunktion auf volatile Objekte aufgerufen werden:

struct A { 
    void f() volatile {} 
    void g() {} 
}; 

int main() { 
    A volatile a; 
    a.f(); // Allowed 
    a.g(); // Doesn't compile 
} 
+1

Was bedeutet flüchtiges Objekt? [kann sich ändern?] – Dineshkumar

+2

"volatile" gibt an, dass auf den Wert von Dingen zugegriffen werden kann, die dem Compiler unbekannt sind (z. B. Speicherkartenhardware), und bestimmte Optimierungen deaktiviert sind. Der Zugriff auf einen "volatilen" Wert wird als Nebeneffekt im Sinne der Als-ob-Regel behandelt. – Mankarse

+0

Aber sind "Objekte" definitionsgemäß nicht flüchtig für Elementfunktionen, wenn wir an eine Elementfunktion denken, die einen "A * this" impliziten Parameter erhält? – einpoklum

9

Auf einer Memberfunktion, const und volatile Qualifier gelten *this. Zugriffe von Instanzmembern innerhalb dieser Memberfunktion wären dann volatile Zugriffe mit derselben Semantik wie jede volatile Variable. Insbesondere nicht-volatile Elementfunktionen können nicht auf ein volatile Objekt aufgerufen werden, und volatile gilt in gleicher Weise wie const Überlastung:

#include <iostream> 

class C { 
public: 

    void f() { 
     std::cout << "f()\n"; 
    } 

    void f() const { 
     std::cout << "f() const\n"; 
    } 

    void f() volatile { 
     std::cout << "f() volatile\n"; 
    } 

    void f() const volatile { 
     std::cout << "f() const volatile\n"; 
    } 

}; 

int main() { 

    C c1; 
    c1.f(); 

    const C c2; 
    c2.f(); 

    volatile C c3; 
    c3.f(); 

    const volatile C c4; 
    c4.f(); 

} 
+0

Compiler zeigt Fehler nicht initialisiert const für c2 und c4? – Dineshkumar

+0

@Dineshkumar: Es sollte nicht. Welchen Compiler benutzen Sie? –

+0

mit GNU GCC. – Dineshkumar

1

Objekte als flüchtig erklärt werden nicht in bestimmten Optimierungen verwendet, weil ihre Werte jederzeit ändern können. Das System liest immer den aktuellen Wert eines flüchtigen Objekts an dem Punkt, an dem es angefordert wird, selbst wenn eine vorherige Anweisung einen Wert von demselben Objekt angefordert hat. Außerdem wird der Wert des Objekts sofort bei der Zuweisung geschrieben.

Ein flüchtiges Objekt kann nur flüchtige Elementfunktionen aufrufen.

Wenn Sie also die Elementfunktion als flüchtig markieren, würden Sie den Zugriff auf die nicht statischen Datenelemente des Objekts innerhalb dieser Elementfunktion als flüchtig festlegen.

Verwandte Themen