C++ “有多少用法?”;易挥发;关键字have在C++;功能,从语法的角度?

C++ “有多少用法?”;易挥发;关键字have在C++;功能,从语法的角度?,c++,function,volatile,C++,Function,Volatile,我问这个函数是基于这个概念的(可能不正确?!):只要一个常量可以存在,一个volatile就可以存在于这个地方 class classA { public: const int Foo() const; } 这里第一个“const”表示返回值是const,我们不能更改它。 第二个常量表示“Is Query”,此函数不能更改成员变量,也不能调用非常量函数 现在谈到volatile:我可以理解volatile对变量的作用,比如“volatile int a 但是,我不知道以下各项之间的区别

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

class classA
{
public:
    const int Foo() const;
}
这里第一个“const”表示返回值是const,我们不能更改它。 第二个常量表示“Is Query”,此函数不能更改成员变量,也不能调用非常量函数

现在谈到volatile:我可以理解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中,你能给“volatile”一个合适的名字/别名吗? 我的意思是,无论何时我们叫这个名字,我们都知道我们在谈论案例2,而不是案例1

提前谢谢你

第二个常量表示“Is Query”,此函数不能更改成员变量,也不能调用非常量函数

是的,没错

volatile void Function1()
返回类型是可变的

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

如果返回类型为
int
,则它前面的
volatile
适用于返回类型。这意味着此返回值只能在
易失性的变量类型中获取

void Function2()易失性
该函数只能调用volatile函数?为什么要在这里添加volatile?有什么例子吗

是的,没错。请参阅下面的代码示例,该示例演示了这一点

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

案例1中的
volatile
是冗余的,如果函数返回
void
(无)。返回值是
volatile
,这是没有意义的,因此上述本质上等同于案例2

一个

#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;
}
#包括
类Myclass
{
公众:
挥发性int i;
Myclass():i(10){}
无效剂量测定法()
{

std::coutVolatile有一个主要功能,即“停止!此对象连接到外部资源,因此当我向其写入时,不要相对于其他Volatile读取或写入对写入进行重新排序,当我向其读取时,不要对其进行同样的重新排序,也不要对其进行优化!”

为了支持这一点,您可以将
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
上尤其没有意义(
const
volatile
如果放在返回类型的顶层,如果该类型不是类类型(即如果是指针,则放在
*
的右侧),则被忽略,因为这些返回值不对应于内存,可能也被实现保存在寄存器中)。将
volatile
放在非顶级的引用或指针上可能很有用,如下所示

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

private:
    volatile const HWOverlayClock *clock;
};
希望能有帮助

第二个常量表示“当
是指向
常量
的指针时可以使用”,此函数不能更改
的非可变
成员变量,也不能调用
上的非常量函数

好了,给你修好了


现在应该清楚了
volatile
成员函数的含义:当
是指向volatile的指针时,可以调用它。如果其他成员函数也是volatile,则它只能调用其他成员函数的要求是结果,而不是核心含义。

volatile只是提示优化器它不能信任v变量赋值不会产生错误的假设。只在多线程代码中使用。我在错误使用的方法中见过“volatile”-注意,将方法标记为这样对方法本身的顺序或其行为方式并没有任何影响。我最近不得不修复了一组代码,作者认为这些代码基本上都变了关闭优化器。这只是类型检查-如中所述,允许对对象的易失性实例调用该方法。这通常是一种不好的做法。@Dani:这在很多方面都是错误的,无法在一条注释中解释。请查看右侧的“相关”部分>>>以了解有趣的(ab)使用
volatile
限定成员函数,阅读相关问题。在这样做之前,请注意:本文只使用上面John Ripley提到的编译时检查,它不使用
volatile
进行任何其他操作,特别是它不使用volatile语义来保证它可能提供或不提供的任何保证对于多线程代码。const和volatile在任何情况下都不相同。最后一段是一派胡言。如果要将它们应用于
this
指针,请将
const
volatile
(或两者)放在参数列表之后,如果要将它们应用于返回类型,请将它们放在签名的开头。“表明目的”和“表明意图”与此无关,这不是风格问题,而是语义问题。说
volatile const hwrovercyclock*clock=(volatile const hwrovercyclock*)0xbabe;
不是比“使用嵌入式定义的方式”更“干净”吗“做同样的事情?也许再多做一点工作,我们就可以把
clock
变成一个引用,而不是指针了。@Chris,也许是真代码中的。”