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

时间:2011-10-04 05:08:25

标签: c++ function volatile

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

class classA
{
public:
    const int Foo() const;
}

这里第一个“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;

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

提前谢谢!

3 个答案:

答案 0 :(得分: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)));

volatile放在返回值上也可以这样做,但在我看来它没那么有用,因为返回值通常是临时值,而volatile语义完全相反。临时工。将volatile放在void上尤其荒谬(如果类型不是类类型,则放在返回类型的顶层时忽略constvolatile*的右边,如果它是一个指针),因为这些返回值与内存不对应,可能也被实现保存在寄存器中)。将volatile放在非顶层的引用或指针上可能很有用,如下所示

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

private:
    volatile const HWOverlayClock *clock;
};

希望它有所帮助。

答案 1 :(得分:3)

  

第二个const意味着“Is Query”,这个函数不能改变成员变量而不能调用非const函数。

是的,那是正确的。

  

volatile void Function1();
  返回类型是不稳定的?

此处函数的返回类型为void(表示无效)。如果它什么都不返回,那么指定返回的任何内容都不是volatile是没有意义的。 volatile前面的空白将是还原的。

如果返回类型为int,则表示前面的volatile适用于返回类型。这意味着此返回值只能采用volatile的变量类型。

  

void Function2()volatile;
  该函数只能调用volatile函数吗?为什么在这里添加volatile?任何例子?

是的,那是正确的。请参阅下面的代码示例,它演示了这一点

  

volatile void Function3()volatile;
  有效吗?如果是,它只是案例1和案例2的组合吗?

案例1中的volatile是多余的,如果函数返回void(没有),则返回的值为volatile是没有意义的,所以基本上等于只是案例2。

sample Example

#include<iostream>

class Myclass
{
    public:
        volatile int i;
        Myclass():i(10){} 
        void doSomething()
        {
            std::cout<<"\nInside doSomething";
        }
        void doSomethingMore() volatile
        {
            std::cout<<"\nInside doSomethingMore";
            doSomething();   //Error


        }

};

int main()
{
     Myclass obj;
     obj.doSomethingMore();

     return 0;
}
  

“Is Query”你能否为案例2中的“volatile”提供一个合适的名字/别名?我的意思是,每当我们称这个名字时,我们都知道我们正在谈论案例2,而不是案例1.

遵循简单的规则:
只要volatileconst关键字出现在声明或定义中函数签名的末尾,关键字就会应用于该函数。

这是因为函数签名之前的任何内容都适用于返回类型。

使用volatile关键字来表示函数签名更有意义,因为它准确地表明了目的,我认为你应该坚持这种标准方式,因为它比任何别名更清楚地表明了意图。

答案 2 :(得分:3)

  

this是指向const“的指针时,第二个const意味着”可以使用,此函数无法更改非 - mutable this 的成员变量,无法在this 上调用非常量函数

在那里,为你修好了。

现在应该清楚volatile成员函数意味着什么:当this是指向volatile的指针时,可以调用它。如果它们也是不稳定的,它只能调用其他成员函数的要求是结果,但不是核心含义。