Volatile Member-Funktionen (C ++)

8

Gegeben die folgende Klasse:

%Vor%

Muss die value () -Memberfunktion auch als flüchtig markiert werden, um zu vermeiden, dass sie wegoptimiert wird, oder ist sie in Ordnung wie geschrieben? Danke.

    
Switch 01.05.2012, 13:45
quelle

4 Antworten

4
  

Muss die value () - Memberfunktion ebenfalls als flüchtig markiert werden, um zu vermeiden, dass sie optimiert wird oder wie geschrieben?

Das Markieren der Elementfunktion volatile hat keine Auswirkung darauf, ob sie optimiert ist oder nicht. Es ist in Ordnung wie geschrieben.

  

Die Sorge ist, wenn ich MyClass c habe; und dann c.value () aufrufen; ein paar Mal könnte der Compiler denken, dass c.value () den gleichen Wert zurückgibt (obwohl er sich möglicherweise geändert haben könnte).

Es klingt, als ob Sie etwas über atomare Variablen lernen möchten. Sehen Sie sich std :: atomic an.

Wenn Sie wirklich etwas über Volatilität erfahren möchten, lesen Sie dieses Papier: Ссылка

    
Andrew Tomazos 01.05.2012, 13:56
quelle
7

Es ist völlig analog zu const funktioniert.

Wenn Sie ein const -Objekt haben, sind nur die mit const gekennzeichneten Elementfunktionen aufrufbar.

Und so ...

Wenn Sie ein volatile -Objekt haben, sind nur die mit volatile gekennzeichneten Elementfunktionen aufrufbar.

Solange das Objekt selbst nicht volatile ist, macht es keinen Unterschied, ob die Funktion ist.

Beachten Sie jedoch, dass volatile nichts mit Multithreading zu tun hat, und nicht Ihnen dabei hilft, threadsicheren Code zu schreiben. Es ist das falsche Werkzeug für alles, was mit Nebenläufigkeit zusammenhängt.

    
jalf 01.05.2012 13:54
quelle
4
  

Die Sorge ist, wenn ich MyClass c habe; und dann c.value () aufrufen; ein paar Mal könnte der Compiler denken, dass c.value () den gleichen Wert zurückgibt (obwohl er sich möglicherweise geändert haben könnte).

In einem separaten Kompilierungsmodell, in dem der Compiler die Interna der Funktion nicht sieht, kann er nicht davon ausgehen, dass sie keine Nebenwirkungen haben ([*]) und somit die verschiedenen Aufrufe der Funktion nicht entfernen können. Wenn der Compiler die Definition der Funktion sieht und den Code einreiht, sieht , dass das Mitglied volatile ist und kann es daher auch nicht optimieren.

[*] Einige Compiler (nämlich gcc) haben spezielle Attribute, mit denen Sie sagen können, dass eine Funktion pur ist (dh sie hat keine Nebenwirkungen und die Ausgabe hängt nur von den angegebenen Argumenten ab ) um mehrere Aufrufe an eine Funktion zu ermöglichen, die beispielsweise in dieser Schleife optimiert werden soll:

%Vor%

Da strlen in der Bibliothek als pure markiert ist, speichert der Compiler den Wert und transformiert die Schleife in:

%Vor%

Aber die Bibliothek muss dem Compiler mitteilen, dass dies möglich ist. Ohne die zusätzliche Information in Form von Attributen kann nichts angenommen werden und die Funktion strlen müsste in jeder Iteration der Schleife aufgerufen werden.

    
quelle
2
  

Konstante und volatile Memberfunktionen (nur C ++)

     

Eine mit dem Qualifikationsmerkmal const deklarierte Memberfunktion kann aufgerufen werden   konstante und nicht konstante Objekte. Eine nichtkonstante Elementfunktion kann   nur für ein nicht konstantes Objekt aufgerufen werden. In ähnlicher Weise eine Mitgliedsfunktion   deklariert mit dem volatilen Qualifier kann für volatile und aufgerufen werden   nichtflüchtige Objekte. Eine nichtflüchtige Elementfunktion kann nur aufgerufen werden   für ein nichtflüchtiges Objekt.

Ссылка

    
phantasmagoria 01.05.2012 13:49
quelle

Tags und Links