从语法角度看,"volatile"关键字在C++函数中有多少用法?

mil*_*sma 7 c++ function volatile

我基于这个概念问了这个函数(可能不正确?!):只要const存在,就可以在这个地方存在一个volatile.

class classA
{
public:
    const int Foo() const;
}
Run Code Online (Sandbox Code Playgroud)

这里第一个"const"表示返回值是const,我们无法改变它.第二个const表示"Is Query",这个函数不能改变成员变量而不能调用非const函数.

现在变得不稳定:我可以理解volatile对变量的作用,比如"volatile int a".但是我不知道以下几点之间的区别:

Case 1: The return type is volatile?
volatile void Function1();

Case 2: The function can only call volatile functions? Why add volatile here? Any example?
void Function2() volatile;

Case 3:   Is it valid? If yes, is it simply a combination of Case 1 and Case 2?
volatile void Function3() volatile;
Run Code Online (Sandbox Code Playgroud)

当我们将const放在函数声明的末尾时,它有一个漂亮的名字:"Is Query"你能为Case 2中的"volatile"提供一个合适的名字/别名吗?我的意思是,每当我们称这个名字时,我们都知道我们在谈论案例2,而不是案例1.

先感谢您!

Joh*_*itb 7

Volatile有一个主要功能,就是说"STOP!这个对象连接到外部资源,因此当我写入它时,不要对其他易失性读取或写入重新排序,当我读取它时,不要同样重新排序,不要优化它们!"

为了支持这一点,您可以添加volatile成员函数,这是在volatile类对象上调用成员函数所必需的.

// just a silly example
struct HWOverlayClock {
  HWOverlayClock() { }

  int64_t getTime() volatile const { return timestamp; }

  int64_t timestamp;
};

// imagine we use an implementation defined way to put the
// object at some fixed machine address
volatile const HWOverlayClock clock __attribute__((at_address(0xbabe)));
Run Code Online (Sandbox Code Playgroud)

volatile一个返回值可以做到过,但在我看来,这将是用处不大,因为返回值通常是临时工和volatile语义相当的临时对象的相对规模.把volatilevoid尤为荒谬的(const并且volatile如果把在返回类型的顶级如果类型不是一个类类型(即在一个合适的被忽略*,如果它是一个指针),因为这些返回值不符合内存,也可能由实现保存在寄存器中).把volatile非顶层用于引用或指针可以是有用的,如在下面

struct Controller {
    HWOverlayClock volatile const* getClock() const { return clock; }

private:
    volatile const HWOverlayClock *clock;
};
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.