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: Ссылка
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.
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:
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.
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.
Tags und Links c++ multithreading volatile