C++ volatile成员函数

0xb*_*00d 39 c++ volatile member-functions

class MyClass
{
    int x, y;
    void foo() volatile {
        // do stuff with x
        // do stuff with y
    }   
};
Run Code Online (Sandbox Code Playgroud)

我是否需要声明x并将其y视为volatile或将成为volatile自动处理的所有成员变量?

我想确保"stuff with x"不会y被编译器的"stuff with " 重新排序.

编辑:如果我将正常类型转换为volatile类型会发生什么?这是否会指示编译器不重新排序对该位置的访问?我想在特殊情况下将一个普通变量传递给一个参数是volatile的函数.我必须确保编译器不会使用先前或后续的读写重新排序该调用.

tem*_*def 33

标记成员函数volatile就像标记它一样const; 这意味着接收器对象被视为声明为a volatile T*.因此,对成员函数的任何引用xy将被视为volatile读取.而且,volatile对象只能调用volatile成员函数.

这就是说,你可能要庆祝x,并y volatile无论如何,如果你真的希望所有访问他们被视为volatile.


lia*_*iaK 9

不必显式声明成员变量.

来自标准文档9.3.2.3,

类似地,当访问对象及其非静态数据成员时,volatile语义(7.1.6.1)适用于volatile成员函数.


ere*_*eOn 7

以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

使用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>
Run Code Online (Sandbox Code Playgroud)

并且由于volatile实例不能调用non-volatile方法,我们可以假设,是,x并且yvolatile在方法中,即使MyClass未声明实例volatile.

注意:如果需要,可以volatile使用a 删除限定符const_cast<>; 但要小心,因为就像这样const做会导致在某些情况下不确定的行为.