2013-05-25 11 views
8

Normalmente vedo l'identificatore const utilizzato per indicare una funzione membro const. Ma cosa significa quando viene utilizzata la parola chiave volatile?Che cosa significa quando una funzione membro è volatile?

void f() volatile {} 

Questo compila bene per me ma non capisco a cosa serva. Non sono riuscito a trovare alcuna informazione su questo nella mia ricerca quindi qualsiasi aiuto è apprezzato.

Aggiornamento: per chiarire, so cosa è per volatile. Non so proprio cosa significhi in questo contesto.

risposta

12

La qualificazione volatile su una funzione membro è analoga alla qualificazione const. Esso consente la funzione membro da richiamare su volatile oggetti:

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

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

cosa significa oggetto volatile? [può cambiare?] – Dineshkumar

+2

'volatile' indica che è possibile accedere al valore da cose sconosciute al compilatore (come l'hardware con memoria mappata) e disabilita determinate ottimizzazioni. L'accesso a un valore 'volatile' viene considerato come un effetto collaterale ai fini della regola as-if. – Mankarse

+0

Ma non sono oggetti "per definizione" volatili per le funzioni dei membri, se pensiamo che una funzione membro ottenga un parametro implicito 'A * questo'? – einpoklum

9

Su una funzione membro, i qualificatori const e volatile si applicano a *this. Gli accessi di qualsiasi membro di istanza all'interno di quella funzione membro sarebbero quindi gli accessi volatile, con la stessa semantica di qualsiasi variabile volatile. In particolare, non funzioni volatile utente non può essere chiamato su un oggetto volatile e volatile applica al sovraccarico nello stesso modo come const:

#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

Il compilatore mostra l'errore const non inizializzato per c2 e c4? – Dineshkumar

+0

@Dineshkumar: Non dovrebbe. Che compilatore stai usando? –

+0

utilizzando GNU GCC. – Dineshkumar

1

oggetti dichiarati volatile non sono utilizzati in alcune ottimizzazioni perché i loro valori possono cambiare in qualsiasi momento. Il sistema legge sempre il valore corrente di un oggetto volatile nel punto in cui viene richiesto, anche se una precedente istruzione richiedeva un valore dallo stesso oggetto. Inoltre, il valore dell'oggetto viene scritto immediatamente sull'assegnazione.

Un oggetto volatile può chiamare solo funzioni membro volatile.

Così, contrassegnando la funzione membro come volatile, si renderebbe volatile qualsiasi accesso ai membri di dati non statici dell'oggetto all'interno di tale membro.

Problemi correlati