我基于这个概念问这个函数(也许不正确?!):只要可以存在 const 的地方,就可以存在 volatile 的地方。
class classA
{
public:
const int Foo() const;
}
这里第一个“const”表示返回值是const,我们不能改变它。
第二个const表示“Is Query”,该函数不能改变成员变量,也不能调用非const函数。
现在谈到 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 中的“易失性”起一个合适的名称/别名吗?
我的意思是,每当我们称呼这个名字时,我们就可以知道我们正在谈论案例 2,而不是案例 1。
先感谢您!
易失性有一个主要功能,也就是说“停止!该对象连接到外部资源,因此当我写入它时,不要相对于其他易失性读取或写入重新排序写入,并且当我读取它时,不要同样重新排序,也不要优化它们!”。
为了支持这一点,你可以把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)));
Putting volatile
也可以在返回值上完成,但在我看来,它的用处不大,因为返回值通常是临时的并且volatile
语义与临时语义完全相反。推杆volatile
on void
是特别无意义的(const
and volatile
如果放置在返回类型的顶层,如果该类型不是类类型(即位于返回类型的右侧),则被忽略*
如果它是一个指针),因为这些返回值与内存不对应,很可能也被实现保存在寄存器中)。推杆volatile
在非顶级的引用或指针上可能很有用,如下所示
struct Controller {
HWOverlayClock volatile const* getClock() const { return clock; }
private:
volatile const HWOverlayClock *clock;
};
希望能帮助到你。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)