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*.因此,对成员函数的任何引用x或y将被视为volatile读取.而且,volatile对象只能调用volatile成员函数.
这就是说,你可能要庆祝x,并y volatile无论如何,如果你真的希望所有访问他们被视为volatile.
以下代码:
#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并且y将volatile在方法中,即使MyClass未声明实例volatile.
注意:如果需要,可以volatile使用a 删除限定符const_cast<>; 但要小心,因为就像这样const做会导致在某些情况下不确定的行为.