class MyClass
{
int x, y;
void foo() volatile {
// do stuff with x
// do stuff with y
}
};
是否需要将x
和y
声明为volatile
,或者将所有成员变量自动视为volatile
?
我想确保编译器不会将“stuff with x
“与“stuff with y
“重新排序。
编辑:如果我将普通类型转换为volatile
类型会发生什么?这是否会指示编译器不重新排序对该位置的访问?我想在一个特殊的情况下传递一个普通的变量给一个参数是volatile的函数。我必须确保编译器不会将该调用与之前或之后的读取和写入重新排序。
4条答案
按热度按时间6pp0gazn1#
将成员函数标记为
volatile
就像将其标记为const
;这意味着接收器对象被视为好像它被声明为volatile T*
。因此,任何对x
或y
的引用都将被视为成员函数中的volatile
读取。此外,volatile
对象只能调用volatile
成员函数。也就是说,如果您确实希望将对
x
和y
的所有访问都视为volatile
,则无论如何都可能希望将它们标记为volatile
。guykilcj2#
你不必须显式声明成员变量。
来自标准文档 9.3.2.3,
同样,volatile语义(7.1.6.1)在访问对象及其非静态数据成员时适用于volatile成员函数。
hyrbngr73#
下面的代码:
使用gcc编译时引发错误:
由于
volatile
示例不能调用non-volatile
方法,所以我们可以假设,是的,x
和y
在方法中将是volatile
,即使MyClass
的示例没有声明为volatile
。注意:如果需要,可以使用
const_cast<>
删除volatile
限定符;但是要小心,因为就像const
一样,在某些情况下这样做会导致未定义的行为。xriantvc4#
因此,使用原始示例: