2013-05-25 10 views
8

通常、constメンバー関数の指定にはconst指定子が使われています。しかし、volatileのキーワードが使われているときはどういう意味ですか?メンバ関数がvolatileであるとはどういう意味ですか?

void f() volatile {} 

これは私にとってうまくコンパイルされますが、これが何であるか分かりません。私は検索でこれに関する情報を見つけることができなかったので、どんな助けもありがたいです。

更新:明確にするために、私はvolatileが何であるかを知っています。この文脈で何が意味するのか分かりません。

答えて

12

volatile修飾子はconst修飾子に類似しています。これは、メンバ関数は、volatileオブジェクトで呼び出すことができますそれらの値はいつでも変更することができますので、揮発性として宣言

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

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

volatileオブジェクトは何を意味しますか? [変更可能?] – Dineshkumar

+2

'volatile'は、コンパイラが未知のもの(メモリマップされたハードウェアなど)によって値がアクセスされ、特定の最適化を無効にすることを示します。 'volatile '値にアクセスすることは、as-ifルールの目的のために副作用として扱われます。 – Mankarse

+0

メンバ関数が 'A * this'暗黙的なパラメータを取得していると考えると、メンバ関数のためにvolatileで定義されたオブジェクトはありませんか? – einpoklum

9

メンバー関数では、constvolatile修飾子が*thisに適用されます。そのメンバー関数内のインスタンスメンバーへのアクセスは、volatileのアクセスとなり、同じセマンティクスは任意のvolatile変数と同じです。特に、非volatileメンバ関数は、volatileオブジェクトで呼び出すことができず、volatileconstと同様に過負荷に適用される:メンバ関数に

#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

コンパイラは、c2とc4の初期化されていないconstエラーを表示しますか? – Dineshkumar

+0

@Dineshkumar:そうしてはいけません。どのコンパイラを使用していますか? –

+0

GNU GCCを使用しています。 – Dineshkumar

1

オブジェクトは、特定の最適化に使用されていません。システムは、たとえ以前の命令が同じオブジェクトから値を要求したとしても、要求された時点で揮発性オブジェクトの現在の値を常に読み込みます。また、オブジェクトの値は割り当て時に即座に書き込まれます。

揮発性オブジェクトは揮発性メンバ関数のみを呼び出すことができます。

したがって、メンバ関数をvolatileとマークすると、そのメンバ関数内のオブジェクトの非静的データメンバにvolatileとしてアクセスすることになります。

関連する問題