在C++中使用volatile成员函数的目的是什么?

use*_*666 21 c++ volatile

volatileC++中成员函数的用途是什么?

Mic*_*urr 23

要回答关于具有"易变成员函数"意味着什么的问题(可能是或者可能不是发布问题的人最初想要的),将成员函数标记为constvolatile(或组合const volatile)应用这些限定符到this函数中使用的指针.如标准所述(9.2.1" this指针"):

在a的成员函数中的类型class XX*.如果成员函数声明const,这种类型是const X*,如果成员函数声明volatile,类型的this就是volatile X*,如果成员函数声明const volatile,这种类型是const volatile X*.

因此,通过标记成员函数,volatile您将对该成员函数中的对象的非静态数据成员进行任何访问volatile.

  • 所以实际上,如果`obj`是`volatile Object*obj`,那么你就不能调用_not_标记为`volatile`的成员函数. (6认同)

Eri*_* J. 6

编辑:

当问题是关于volatile关键字时,发布了这个答案.问题似乎已由第三方改变.

原版的:

易失性通知编译器它不应该假设它刚刚放入标记为volatile的变量中的值将在下次使用它时...它必须在再次使用它之前检查当前值.

一个示例是变量表示可能由另一个进程更改的内存位置.

这是一个例子(自从我做C++以来已经很久了,所以请原谅任何次要的语法问题):

volatile int x;

int DoSomething()
{
    x = 1;

    DoSomeOtherStuff();

    return x+1; // Don't just return 2 because we stored a 1 in x.  
                // Check to get its current value
}
Run Code Online (Sandbox Code Playgroud)

  • @jasonline:它告诉编译器它不能改变读写的数量或顺序,并且它不能跨序列点移动任何读或写.它并没有确切地告诉它"不进行任何优化".例如,修改挥发物的循环仍然可以展开,访问挥发物的代码可以在非易失性访问中移动.我想如果你有硬件事务内存并且没有神奇的I/O地址,那么即使是推测性执行也是可以的. (4认同)
  • 这是对的。它通常用于嵌入式和实时应用程序。 (2认同)