c ++类的成员函数包含以下代码:
const volatile stats_t& get_stats() const{
return stats;
}
同时使用const和volatile的原因是什么?这个功能到底是什么功能?如果返回类型是const,它是否与使用volatile的目的相矛盾?
答案 0 :(得分:9)
const
与volatile
将某些内容标记为const
意味着"这不会被这段代码修改,它是一个常量值/指针/无论什么"
将某些内容标记为volatile
意味着"不要缓存此值,它可能会突然被外部IO操作,中断或其他内容更改"
它们用于不同的目的。 const更像是一个" 代码不要修改规则"易变的" 缓存,重新排序和编译器优化规则"
答案 1 :(得分:2)
可能的情况是你有一个主线程,读取统计数据,以及一个更新统计数据的辅助线程。因此,主线程想要"得到"统计数据,以了解它们的存储位置。这将是const
,因为我们不希望主线程修改统计信息,还要volatile
,因为统计信息正在由辅助线程定期更新[当然,其中,值不是常量]。
函数之后的const
只意味着this
是函数中的const
指针(换句话说,我们不会在对该特定的调用中更改对象的内容功能)。
当然,如果stats_t
实际上是指向硬件中的某些有趣寄存器的指针,则会应用相同的方案。编译器无法知道它们何时/如何更新,因此不得假设它永远不会改变,除非调用函数"。
编辑:但是请注意,volatile
在无线路中保证线程和操作在多线程环境中的正确性。它仅意味着编译器不会优化对变量的访问,因为它已经在某个早期点读取了值。为了保证线程行为,你真的需要原子操作或锁[这是一个相当复杂的主题,我可能会写几个关于这个主题的页面,专家可能最终写完整本书]