46
class MyClass
{
    int x, y;
    void foo() volatile {
        // do stuff with x
        // do stuff with y
    }   
};

すべてのメンバー変数を自動的に宣言する必要がありxますかy、それとも自動的にvolatile扱われvolatileますか?

コンパイラによってx「stuffwith」が「stuffwith」に並べ替えられないようにしたい。y

編集:通常のタイプをタイプにキャストするとどうなりvolatileますか?これは、その場所へのアクセスを並べ替えないようにコンパイラーに指示しますか?特別な状況で、パラメーターが揮発性である関数に正規変数を渡したいです。コンパイラがその呼び出しを前または後の読み取りと書き込みで並べ替えないようにする必要があります。

4

4 に答える 4

42

メンバー関数volatileをマークすることは、それをマークすることに似ていconstます。これは、レシーバーオブジェクトがとして宣言されたかのように扱われることを意味しますvolatile T*。結果として、xまたはへの参照は、メンバー関数yの読み取りとして扱われます。volatileさらに、オブジェクトはメンバー関数volatileのみを呼び出すことができます。volatile

とは言うものの、マークを付けたいx場合もありy volatileますが、本当にそれらへのすべてのアクセスをとして扱いたい場合はとにかくvolatile

于 2011-01-28T09:43:36.930 に答える
10

メンバー変数を明示的に宣言する必要はありません。

標準ドキュメント9.3.2.3から、

同様に、揮発性セマンティクス(7.1.6.1)は、オブジェクトとその非静的データメンバーにアクセスするときに、揮発性メンバー関数に適用されます。

于 2011-01-28T10:04:05.940 に答える
8

次のコード:

#include <iostream>

class Bar
{
    public:

        void test();
};

class Foo
{
    public:

        void test() volatile { x.test(); }

    private:

        Bar x;
};

int main()
{
    Foo foo;

    foo.test();

    return 0;
}

gccでコンパイルするとエラーが発生します:

main.cpp: In member function 'void Foo::test() volatile':
main.cpp:14:33: error: no matching function for call to 'Bar::test() volatile'
main.cpp:7:8: note: candidate is: void Bar::test() <near match>

また、volatileインスタンスはメソッドを呼び出すことができないため、のインスタンスが宣言されていない場合でも、はい、メソッドに含まれるとnon-volatile想定できます。xyvolatileMyClassvolatile

注:必要に応じて、volatileを使用して修飾子を削除できconst_cast<>ます。ただし、そうするのと同じようconstに、場合によっては未定義の動作につながる可能性があるため、注意してください。

于 2011-01-28T09:43:58.093 に答える
3

したがって、元の例を使用すると、次のようになります。

class MyClass
{
    int x, y;
    void foo() volatile {
        // do stuff with x
        // do stuff with y
        // with no "non-volatile" optimization of the stuff done with x, y (or anything else)
    }   
    void foo() {
        // do stuff with x
        // do stuff with y
        // the stuff done with x, y (and anything else) may be optimized
    } 
};
于 2014-09-03T20:54:31.663 に答える