C++ “有多少用法?”;易挥发;关键字have在C++;功能,从语法的角度?
我问这个函数是基于这个概念的(可能不正确?!):只要一个常量可以存在,一个volatile就可以存在于这个地方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 但是,我不知道以下各项之间的区别
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,也许是真代码中的。”